当前位置: 技术问答>linux和unix
多线程修改界面的问题
来源: 互联网 发布时间:2016-08-24
本文导语: 我在一个线程中对程序界面进行动态修改,其中用到了gdk_threads_enter和gdk_threads_leave,效果还不错,不过问题出在退出界面上,当我退出界面时,有时界面就会卡死,代码大致如下 void *thread (void *arg) { ... ...
我在一个线程中对程序界面进行动态修改,其中用到了gdk_threads_enter和gdk_threads_leave,效果还不错,不过问题出在退出界面上,当我退出界面时,有时界面就会卡死,代码大致如下
void *thread (void *arg)
{
...
gdk_threads_enter ();
//更新界面
...
gdk_threads_leave ();
}
//点击退出时进入此界面
static void on_quit ()
{
//进入该函数就相当于进入了一个临界区,在退出此函数之前,界面就无法更新
//一旦退出此函数,界面的数据就不复存在了,线程也要在此结束
}
如果在退出函数里结束线程,并不使界面卡死?
void *thread (void *arg)
{
...
gdk_threads_enter ();
//更新界面
...
gdk_threads_leave ();
}
//点击退出时进入此界面
static void on_quit ()
{
//进入该函数就相当于进入了一个临界区,在退出此函数之前,界面就无法更新
//一旦退出此函数,界面的数据就不复存在了,线程也要在此结束
}
如果在退出函数里结束线程,并不使界面卡死?
|
void *thread (void *arg)
{
...
gdk_threads_enter ();
//更新界面
...
gdk_threads_leave ();
}
你这个函数是在循环做事?
不能把锁占住了不放。我也去看了看文档,好像上次也有个网友出现过这种线程无法获取锁的问题。
你试试
void *thread (void *arg)
{
for(;;)
{
gdk_threads_enter ();
//更新界面
gdk_flush();
gdk_threads_leave ();
}
}
或者这样看看
void *thread (void *arg)
{
for(;;)
{
gdk_threads_enter ();
//更新界面
gdk_threads_leave ();
}
gdk_flush();
}
我猜你和那个网友是同样的问题,锁都被void *thread (void *arg)这个线程占用了。
{
...
gdk_threads_enter ();
//更新界面
...
gdk_threads_leave ();
}
你这个函数是在循环做事?
不能把锁占住了不放。我也去看了看文档,好像上次也有个网友出现过这种线程无法获取锁的问题。
你试试
void *thread (void *arg)
{
for(;;)
{
gdk_threads_enter ();
//更新界面
gdk_flush();
gdk_threads_leave ();
}
}
或者这样看看
void *thread (void *arg)
{
for(;;)
{
gdk_threads_enter ();
//更新界面
gdk_threads_leave ();
}
gdk_flush();
}
我猜你和那个网友是同样的问题,锁都被void *thread (void *arg)这个线程占用了。
|
把下面的代码放在需要刷新的地方即可
while(gtk_events_pending()){ gtk_main_iteration(); } sleep(1);
相当于vc的update()
while(gtk_events_pending()){ gtk_main_iteration(); } sleep(1);
相当于vc的update()
|
以前学gtk的时候没学到多线程
加上试试
加上试试
|
这个帖子也是GTK界面卡死 你看看有没有帮助
http://topic.csdn.net/u/20090520/10/f61b5919-e975-4633-a26b-9e2bfd9a6be3.html
http://topic.csdn.net/u/20090520/10/f61b5919-e975-4633-a26b-9e2bfd9a6be3.html
|
gtk_idle_add //在这对程序界面进行修改
其他线程修改数据队列或者链表
//数据保护
pthread_mutex_lock
pthread_mutex_unlock
可以参考
http://topic.csdn.net/u/20100308/13/5daf15c7-efcd-43af-8f4e-770d5cd9aea9.html
其他线程修改数据队列或者链表
//数据保护
pthread_mutex_lock
pthread_mutex_unlock
可以参考
http://topic.csdn.net/u/20100308/13/5daf15c7-efcd-43af-8f4e-770d5cd9aea9.html
|
碰到过啊,用我以上的方法就可以很好地解决。
在其它线程将相关数据填入数据队列或链表,在GTK主线程的空闲处理函数中更新相应窗口控件
在其它线程将相关数据填入数据队列或链表,在GTK主线程的空闲处理函数中更新相应窗口控件