LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1201|回复: 8

GTK+ 2的多线程编程

[复制链接]
发表于 2004-7-16 03:28:10 | 显示全部楼层 |阅读模式
小弟不才.看了很多资料和源代码也是不太明白..gtk2.0里的多线程是怎样搞的

小弟的一个程序...需要常常要删除/tmp里.由程序生成的一些文件或打开一些文件,如果打开或删除的文件比较少时还没什么.如果是大的文件.整个程序界面就不刷新了,最明显的就是,,在程序删除文件时,,程序会有一个进度条显示..但这个进度条,,有时能显示,但不刷新...有时根本上是显示不出来,要等到删除操作完成后才能显示出来...

我想让这两个操作同时进行....请对gtk2里的多线程编程熟悉的大侠告知一二,,

谢谢
发表于 2004-7-16 11:36:52 | 显示全部楼层
pthread不能满足你的要求么
发表于 2004-7-16 14:56:22 | 显示全部楼层
看起来是同步有问题
 楼主| 发表于 2004-7-16 16:17:42 | 显示全部楼层
....................
我是对多线程编程一点也不通..........
发表于 2004-7-17 00:28:08 | 显示全部楼层
那你首先要搞明白什么是线程,怎么创建a线程等最基本概念。

然后,对于GTK,多个线程不能同时访问界面元素,要保证同时只有一个线程访问界面,最简单的办法就是只在主线程中更新界面,如果其它的线程也需要更新界面,则实用idle_add,让主线程在空闲时执行相应的方法。

多线程的程序设计是一个基本的概念,只不过如果你实用了GTK,则需要遵守一些GTK自己的规定。
 楼主| 发表于 2004-7-18 03:23:42 | 显示全部楼层
我只想,,用一个进度条显示程序操作完成的进度..操作完成后进度条自动关闭,,应该是很简单的了...

哈....我看多点资料再说吧
发表于 2004-7-18 06:53:42 | 显示全部楼层
资料却是难找。我找了好久才把我的程序调通。

大体如下:
main()
{
...
  g_thread_init(NULL);
  gdk_threads_init();

  add_pixmap_directory (PACKAGE_DATA_DIR "/" PACKAGE "/pixmaps");
  create_window_main();
  gtk_widget_show(window_main);

   .....

}



线程中如果需要更新界面,要用到
        if(pthread_self() != global_main_thread.thread) //如果不是主线程才可以加锁。否则会死锁
                if(g_mutex_trylock (gdk_threads_mutex)) //试图加锁,如果不成功,则线程以后的代码就不要更新UI了。否则必死。
                        can_refresh = TRUE;  //成功加锁,可以更新

               if(can_refresh) 可以更新界面了。
               else 放弃更新。GTK会自动处理的。

处理完成后:
        if(can_refresh)
                gdk_threads_leave();  //其实就是释放 gdk_threads_mutex
发表于 2004-7-18 08:16:55 | 显示全部楼层
我主页上的程序用到了多线程,可以看看代码。
不过还是有警告的,我也正在找问题和解决办法,
ibm 主页上有宋国伟写的多线程例程,也进行了讲解。
 楼主| 发表于 2004-7-18 14:36:16 | 显示全部楼层
gnome里的FileRoller和grip都实现得很好......
一边后台操作一面进度条提示....
只是看不明白其中

谢谢楼上的老兄...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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