LinuxSir.cn,穿越时空的Linuxsir!

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

gtk如何用滚动条显示文件载入信息

[复制链接]
发表于 2011-1-21 14:57:43 | 显示全部楼层 |阅读模式
我用的是gtk1.2, 主线程是在一个窗口菜单选项中选择载入文件,打开另一个窗口,并在其中选择了相应文件之后,按确定键开始解析文件信息,因为文件过大解析时间会比较长,界面会一直处于挂死状态,需要用一个滚动条来告诉用户正在解析文件,否则会误认为程序已经死掉了。想在解析之前*出一个滚动条,一直是滚动状态,然后开始解析,完成之后关掉滚动条。但是目前的问题是,点击确定之后总是先解析文件,界面挂死状态,解析完成之后滚动条才*出。看论坛帖子中提到过类似问题要用gdk_threads_enter, gdk_threads_leave, 用多线程的方式来解决,但是不知道具体应该怎么用,而且gtk1.2本身API也有很大的限制行,哪位大侠能给点指示么?

程序样式大概如此:
void *show_progressbar(void *args)
{
  ......
  gtk_widget_show(window);
  ......
}
int xxxx::OnEvent(GtkWidget *widget, const char *name, gpointer user_data)
{
  if (!strcmp(name, "Openfile"))
  {
     pthread_create(..., ..., show_progressbar, ...);

     if (-1 =  Parsefiles())
     {
        return 0;
     };
  }
  ......
  return 0;
}
 楼主| 发表于 2011-1-24 10:27:32 | 显示全部楼层
为什么都么有人回答呢?是太简单了,还是我没说清楚?
焦急等待中......求教各位高手指点指点!!
回复 支持 反对

使用道具 举报

发表于 2011-1-26 11:28:41 | 显示全部楼层
不需要多线程,用gtk_window_*的功能即可。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-1-26 11:45:51 | 显示全部楼层
Post by realtang;2126740
不需要多线程,用gtk_dialog_*的功能即可。


不好意思, 还不是很明白,目前的状况是,如果不应用pthread_create,只是把创建滚动条的操作放到解析文件的代码之前,同样到了解析代码的时候阻塞了,主要就是在
if (-1 = Parsefiles())
{
return 0;
};
处阻塞。整个界面就是卡死状态,解析完了之后滚动条才显示出来。是不是就是main loop只在空闲的情况下才会去重画界面的解释?
最近找了相干文章看到过这样的情况应该用类似:
while (gtk_events_pending())
    gtk_main_iteration();
的处理方式,试了之后发现解析的时候滚动条是出来了,但是马上就跟别的界面一样挂死,直到解析完成之后继续滚动。还请realtang能多给点指点!多谢多谢!
回复 支持 反对

使用道具 举报

发表于 2011-1-28 09:56:23 | 显示全部楼层
Parsefiles里采用时间分片设计,在某个时间片用完之后,更新滚动条状态,然后调用while(gtk_events_pending())
  gtk_main_iteration();
以响应界面。
Example 2. Updating the GUI during a long computation.

        /* computation going on */
...
        while (gtk_events_pending ())
          gtk_main_iteration ();
...
        /* computation continued */
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-1-28 11:05:35 | 显示全部楼层
谢谢realtang的解释,明白了很多, 前两天用这种方式已经实现了。因为我解析文件的大计算里面还有很多层调用,后来把这种方式应用到最根本的计算的地方才生效了,应该就是realtang说的时间片的概念吧。非常感谢realtang的解释!
回复 支持 反对

使用道具 举报

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

本版积分规则

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