当前位置:  技术问答>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 ();
}

你这个函数是在循环做事?
不能把锁占住了不放。我也去看了看文档,好像上次也有个网友出现过这种线程无法获取锁的问题。

你试试


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()

|
以前学gtk的时候没学到多线程
 加上试试

|
这个帖子也是GTK界面卡死  你看看有没有帮助
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

|
碰到过啊,用我以上的方法就可以很好地解决。

在其它线程将相关数据填入数据队列或链表,在GTK主线程的空闲处理函数中更新相应窗口控件

    
 
 

您可能感兴趣的文章:

  • 如何在工作线程中调用图形界面线程的成员函数(串口通信)?
  • 线程和界面
  • 关于gtk多线程界面的问题
  • 一个线程函数如何取得GTK界面的所有控件指针?
  • 线程函数里不能调用消息对话框吗?(GTK界面)
  • android开发教程之子线程中更新界面
  • 我想把STL中的vector,map,set,multimap,multiset的所有操作修改成线程安全的,可以么
  • 请问Linux下单个进程带有的线程数目的最大值在哪里可以查到呢,可以修改么?谢谢
  • 如何修改主线程的调度策略
  • 线程修改了static数据,为什么别的函数读不到?
  • 请问在Linux下怎么修改当前线程的优先级?
  • 请问linux中文件读写放在进程中和线程中性能为什么差别大。修改线程优先级也不行.
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Java中多线程相关类Thread介绍
  • 一个进程创建了两个线程,如何使得当任何一个线程(比如线程a)结束时,同时也结束线程b,也就是使两个线程一起死掉,怎么办呢?
  • c#多线程更新窗口(winform)GUI的数据
  • java 线程,对当前线程(非主线程)调用sleep,为什么主线程(窗口)也没反应了
  • Windows和Linux下C++类成员方法作为线程函数方法介绍
  • 如何实现一个线程组内多线程的非同不执行,即一个线程执行完毕后再执行下一个线程???
  • c++的boost库多线程(Thread)编程(线程操作,互斥体mutex,条件变量)详解
  • 请问:进程创建的线程是怎样运行的啊,线程的处理函数运行完了,线程就退出了吗?
  • Linux下GCC内置原子操作函数(多线程资源访问)介绍
  • 关于线程的问题,什么样的线程不是active线程?
  • 请问Linux核心支持多线程吗?开发库有线程库吗?线程好用吗?(稳定?)
  • 请问,在一个进程中创建多线程时如何能避免不同的线程获得同一个线程标识
  • 我的一个多线程服务里, 总是有一个线程莫名其妙的变成僵尸线程。
  • 能否通过线程id控制线程的状态?或是观察到线程的状态?
  • 如何在一个线程中启动另外一个线程,然后本线程就退出?
  • 我要设置一个线程的优先级, 这个属性结构并没有线程的id,它怎么知道是设置哪个线程呢?
  • 请问在java多线程中,是只有run(){}内的代码运行在一个新线程下呢?还是这个类中的代码都运行在一个新线程下?
  • gcc链接的库,分不分单线程版本的和多线程版本的?
  • 内核栈~ 内核线程 ~用户线程 之间关系 问题
  • 子线程的数据如何返回给主线程?
  • 如果父线程死掉 那么子线程会不会死掉呢


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3