• 10427阅读
  • 13回复

后台程序跑的比较长,QT界面老是失去响应 [复制链接]

上一主题 下一主题
离线fogsnow
 
只看楼主 倒序阅读 楼主  发表于: 2009-01-05
— 本帖被 XChinux 执行加亮操作(2009-01-06) —
我做了个蒙特卡洛模拟的程序
选的路径比较少的话,界面很正常,进度条一直在走

如果选的路径比较多的话,计算比较长。期间只要一切换窗口,界面就失去响应了,进度条就停在那儿了。

我把所有的计算都摆在slot函数里了,一个push按钮clicked()做signal


请问这是怎么回事?
该怎么解决呢?
离线fogsnow
只看该作者 1楼 发表于: 2009-01-05
我还是好好研究一下多线程吧
离线guyansrg

只看该作者 2楼 发表于: 2009-01-06
是啊,多看看多线程吧 
离线optphantom

只看该作者 3楼 发表于: 2009-01-06
可用两种方法解决,一种就是如两位所说的采用多线程,将计算过程置于一个独立线程中;另一种则采用qApp->processEvents();获取系统消息
离线fogsnow
只看该作者 4楼 发表于: 2009-01-06
参见C++ GUI Programming with Qt4 
Chapter 7.3 Staying Responsive During Intensive Processing (processEvents)
Chapter 18. Multithreading

哎,资料太少
像我这样的新手
很难迅速上手啊
离线wd007

只看该作者 5楼 发表于: 2009-01-06
qApp->processEvents();
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线xjcook

只看该作者 6楼 发表于: 2009-01-07
多线程没有想象中那么复杂。
离线fogsnow
只看该作者 7楼 发表于: 2009-01-07
恩,搞了一会儿简单的搞出来了
但是我的计算线程需要给出好多个vector<vector<double>>

我暂时还没法将他们传回主线程
离线wvins
只看该作者 8楼 发表于: 2009-01-07
数据流向尽可能简单,模块调用也一样

避免 A调用B,B再调用A
-------------
主线程启动工作线程,
等待工作线程结束(如果需要可以在这个过程中做些其他操作,通常是死循环处理系统消息,就像wd007那样)

主线程访问工作线程取值函数或者其他什么东西操作线程生成的数据,
比如你的vector<vector<double>>
离线xjcook

只看该作者 9楼 发表于: 2009-01-07
在线程里发送一个事件给你的主进程,然后进程去读线程里的vector<vector<double>>
离线fogsnow
只看该作者 10楼 发表于: 2009-01-08
引用第8楼wvins于2009-01-07 12:27发表的  :
主线程访问工作线程取值函数或者其他什么东西操作线程生成的数据,
比如你的vector<vector<double>>


我是这么做的
worker thread:
signal:
        void mc_ok(vector<vector<double>> data);

GUI thread:
slot:
        void get_data(vector<vector<double>> data);

connect(&workerthread,SIGNAL(mc_ok(vector<vector<double>>)),
                this,SLOT(get_data(vector<vector><double>>));


我根据例子照葫芦画票,不知道还有什么更好的方法
我这样好像不行啊
离线fogsnow
只看该作者 11楼 发表于: 2009-01-08
引用第9楼xjcook于2009-01-07 14:43发表的  :
在线程里发送一个事件给你的主进程,然后进程去读线程里的vector<vector<double>>


在线程里发事件
是指signal吗?

我比较菜哈
刚刚接触Qt,要求比较简单,就是给原来的控制台程序做个界面
离线xjcook

只看该作者 12楼 发表于: 2009-01-08
发事件是指postEvent,qt自带的例子里就有线程给进程发事件的。
使用信号和槽我是不推荐的,因为发事件是异步的,而信号和槽还是同步的,
在线程里面调用GUI的函数是不合理的,因为GUI的很多函数不是线程安全的,
如果必须使用的话,需要加锁,否则可能出现莫名其妙的非法。
而使用postEvent是安全的。
离线wvins
只看该作者 13楼 发表于: 2009-01-08
在线程里面调用GUI的函数是不合理的,因为GUI的很多函数不是线程安全的,
---------------------
这句话是正确的,不过使用QMutex和GUI是没有关系的
无论什么多线程最终都要同步,
QMutex是等待信号量,PostEvent是等待固定的消息。
---------------------
不过千万不要在PostEvent的时候发送你的Vetor
快速回复
限100 字节
 
上一个 下一个