QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 831|回复: 12

gtk+for(;;)

[复制链接]
发表于 2004-12-2 00:47:00 | 显示全部楼层 |阅读模式
我写了个小程序片段
用的了gtk基本的 gtk_signal_connect这些函数
然后我写了个
print(){
for(;;)
{prntf("Hello\n");}
}
是个无限循环
我创建了个pthread来启动这个print函数
我用了button来启动这个线程,
不过当 gtk_signal_connect()启动了这个线程也就是这个函数的时候
主窗口就死掉了
怎么样不让主窗口不死掉呢?

非常感谢!!!
发表于 2004-12-2 10:05:00 | 显示全部楼层
贴出button callback部分源码
回复

使用道具 举报

 楼主| 发表于 2004-12-2 21:28:05 | 显示全部楼层
[code:1]#include<gtk/gtk.h>
#include<pthread.h>
int print(){
int i=0;
for(;;)
{
printf("Hello World+%d\n",i);
i++;
}
}
void init()
{
pthread_t thread;
if(pthread_create(&thread,NULL,(void*)print,NULL))
printf("not enouth resources for create a thread\n");
if(pthread_join(thread,NULL))printf("error to join the thread!\n");
}
GtkWidget *
create_window()
{GtkWidget *button;
GtkWidget *window;
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);
gtk_window_set_default_size(GTK_WINDOW(window),500,100);
gtk_container_set_border_width(GTK_CONTAINER(window),40);
button=gtk_button_new_with_label("printf hello world");
gtk_signal_connect_after(GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (init), NULL);
gtk_container_add(GTK_CONTAINER(window),button);
return window;
}

int main(int argc,char*argv[]){
gtk_init(&argc,&argv);
GtkWidget *window1=create_window();
pthread_t window_thread;
gtk_widget_show_all(window1);
gtk_main();
return FALSE;
}[/code:1]
回复

使用道具 举报

 楼主| 发表于 2004-12-2 21:28:34 | 显示全部楼层
全部源代码 奉上
劳驾了
回复

使用道具 举报

发表于 2004-12-3 00:11:09 | 显示全部楼层
你的信号处理函数没有返回(因为join在print返回后才会返回),窗口就没有响应了。
回复

使用道具 举报

 楼主| 发表于 2004-12-3 21:33:08 | 显示全部楼层
阁下 能在讲的详细点吗? 说实在的 我不是很明白%
劳驾
回复

使用道具 举报

发表于 2004-12-3 22:01:17 | 显示全部楼层
因为pthread_join是阻塞的,它等待线程返回,但是你的线程函数是个死循环,所以程序运行到pthread_join就一直处于等待状态,而gtk_main要等待callback函数的返回,等不到返回当然就进行不下去。
回复

使用道具 举报

 楼主| 发表于 2004-12-3 23:06:31 | 显示全部楼层

mozilla大哥
那么能指点一下怎么解决吗?

不用pthread_join函数还是……
我不加入pthread_join函数也是一样的……
我很菜阿……
劳驾…………
回复

使用道具 举报

发表于 2004-12-3 23:37:31 | 显示全部楼层
你那个for循环一点延时都没有,cpu资源都被它用光了,不死才怪。
[code:1]
#include<gtk/gtk.h>
#include<pthread.h>
int print()
{
        int i=0;
        for(;;)
        {
                printf("Hello World+%d\n",i);
                i++;
                sleep(1);
        }
}
void init()
{
        pthread_t thread;
        if(pthread_create(&thread,NULL,(void*)print,NULL))
                printf("not enouth resources for create a thread\n");
//        if(pthread_join(thread,NULL))printf("error to join the thread!\n");
}
GtkWidget *
create_window()
{
        GtkWidget *button;
        GtkWidget *window;
        window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
        g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);
        gtk_window_set_default_size(GTK_WINDOW(window),500,100);
        gtk_container_set_border_width(GTK_CONTAINER(window),40);
        button=gtk_button_new_with_label("printf hello world");
        gtk_signal_connect_after(GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (init), NULL);
        gtk_container_add(GTK_CONTAINER(window),button);
        return window;
}

int main(int argc,char*argv[])
{
        gtk_init(&argc,&argv);
        GtkWidget *window1=create_window();
        pthread_t window_thread;
        gtk_widget_show_all(window1);
        gtk_main();
        return FALSE;
}


[/code:1]
回复

使用道具 举报

 楼主| 发表于 2004-12-3 23:49:33 | 显示全部楼层
疯狂的感谢  
mozilla
还有
sagaeon
大哥

终于不死了%……
回复

使用道具 举报

 楼主| 发表于 2004-12-3 23:53:41 | 显示全部楼层
没想到 一个无限循环居然可以
耗掉cpu全部的资源……
cpu未免太弱了吧?
………………………………………………………………
回复

使用道具 举报

发表于 2004-12-4 10:16:37 | 显示全部楼层
你的无限循环当然不能耗掉cpu全部的资源,不信你试试其它程序响应是没问题的。是说你的循环会耗掉系统分配给这个进程的全部cpu资源,系统只会按调度算法分配一部分给它。
回复

使用道具 举报

 楼主| 发表于 2004-12-5 10:56:31 | 显示全部楼层
哦  知道了  
多谢sagaeon 指点迷津
  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-6 23:37 , Processed in 0.044946 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表