首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

QT中开展耗时运算时,界面无响应

2012-12-22 
QT中进行耗时运算时,界面无响应在下使用QT编写一个界面进行一些数据处理。具体的处理过程使用QThread开辟线

QT中进行耗时运算时,界面无响应
在下使用QT编写一个界面进行一些数据处理。具体的处理过程使用QThread开辟线程处理。
相关代码如下:
GUI.CPP
test_Thread *test_Thread_load=new test_Thread;
test_Thread_load->start();
test_Thread_load->run(readDesc,loadsize,file);
......

Thread.cpp
void test_Thread::run(S_READDESC readDesc,int loadsize,QFile *file)
{
......耗时处理
}

现在的问题是,虽然耗时处理在开辟的线程中处理;但是在处理数据时,主界面仍然卡死。
望哪位大神不惜赐教,多谢!
[最优解释]
test_Thread_load->run(readDesc,loadsize,file);用错了
你start就不用管了

会自动调用run函数。
[其他解释]

引用:
引用:test_Thread_load->run(readDesc,loadsize,file);用错了
你start就不用管了

会自动调用run函数。
那我想往run函数里传数据还要另外开信号和槽里?


可以这样做,弄个友元类也行吧
[其他解释]
子线程主动调用run()?

start之后不就自动调用run()了么?
[其他解释]
引用:
test_Thread_load->run(readDesc,loadsize,file);用错了
你start就不用管了

会自动调用run函数。

那我想往run函数里传数据还要另外开信号和槽里?
[其他解释]
引用:
引用:test_Thread_load->run(readDesc,loadsize,file);用错了
你start就不用管了

会自动调用run函数。
那我想往run函数里传数据还要另外开信号和槽里?


!!!!!

遇到问题多想想有什么更好的解决办法,你的那三个参数难道不能通过类的构造函数传过去么?
[其他解释]
楼主,我遇到和你相同的问题,可是我不会写多线程,我们能QQ聊不 740766466
[其他解释]
是这样的,其实我问题不算复杂,我要遍历目录,如果目录文件比较多那么遍历起来就会卡死一会,主线程不能响应界面的其他操作,我想另开一个线程专做遍历,主线程响应界面的各种事件,可是我没写过多线程,尤其是Qt的多线程我更不懂,其实我只是要个格式 。
[其他解释]
引用:
引用:引用:test_Thread_load->run(readDesc,loadsize,file);用错了
你start就不用管了

会自动调用run函数。
那我想往run函数里传数据还要另外开信号和槽里?

!!!!!

遇到问题多想想有什么更好的解决办法,你的那三个参数难道……


直接使用start,通过信号和槽传递数据。
问题解决,数据处理量再大也不会导致主界面卡死。
另外,之前QT只学过一点点,看到过个例子里直接往run里传函数开线程;直接拿来用了,然后就被坑了。。。。通过调试发现,原来的方法貌似run函数直接运行在主线程里。。晕。
[其他解释]
不是有个qApp全局变量吗,qApp->processEvent(...)就是主动处理消息的。
请采纳。
[其他解释]
引用:
不是有个qApp全局变量吗,qApp->processEvent(...)就是主动处理消息的。
请采纳。


processEvent(...)本质上是本地循环运算。我的这个程序会进行大量的数据传输,数据量有可能达到上百G。为了性能的考虑,buff给的大小是4K,如果使用轮询的话,每次填充buff之后都要运行GUI,开销要比线程大得多。如果减少轮询次数的话,又要增加计数器,得不偿失。
[其他解释]
在线程对象构造时将参数传递进去
[其他解释]
new 完对象后, set 进参数
全完成后再 start 呀。
多简单?

参数少的话,就用楼主的方式,直接构造时传进去。
[其他解释]
假设你用的是model view结构哈。。

你可以完全把model部分做成一个共享资源哈。。
访问的时候加锁就好了。
[其他解释]
楼主,我也是啊,Qt多线程,遇到了跟您一模一样的问题,看回复您是解决了,我还没有,太苦恼了!我们交流一下吧,谢谢,我qq:672528926

热点排行