• 13761阅读
  • 7回复

多线程应用,主界面假死的问题。 [复制链接]

上一主题 下一主题
离线erlangxiong
 
只看楼主 正序阅读 楼主  发表于: 2010-07-19
首先,创立一个继承Qthread的线程
class MapCanvas;    //MapCanvas继承修改自QGraphicsView;
class RoadDetectionThread : public QThread
{
public:
 RoadDetectionThread();
 RoadDetectionThread(MapCanvas* pCanvas);
......
public:
 / //对外接口:准备、开启线程、等待线程结束、绘图
 void  RoadDetection(void* pIplImage, double roadWidth);
........
void run();
.........
}

void RSI_RoadDetectionThread::RoadDetection(void* pIplImage, double roadWidth) 中开启线程计算;
{
...........

   //开启线程提取道路;
   start();
   while (this->isRunning())
   {
   progressBarValue += 8;
   progress.setValue(progressBarValue % 100);
   QThread::msleep(100); //注意:
   }
}
run()中实现数据的计算和显示,注意这里的计算比较大时间比较久,程序也是主要卡在这里运行;(本来想多线程解决的,结果主窗口还是假死!~郁闷)



然后,在主窗口的一个按钮事件函数void MainWindow::on_detectRoadwayAction_triggered()中新建这个线程并启动接口函数:
{
........
       m_pRoadDetectThread = new RoadDetectionThread(m_pCanvas);//主窗口的画布传给新线程;
       m_pRoadDetectThread->RoadDetection(pImg, RoadWidth); 
........
}

程序跑通没有问题,问题在于本来想用多线程解决计算部分时间长的问题,结果程序还是卡在新的计算线程,主窗口不可以动了。请教各位大大我的方法有什么问题、或者有什么可以解决的方法么?

谢谢!~!~!~!~!~



 
离线dbzhang800

只看该作者 7楼 发表于: 2010-07-20
引用第6楼erlangxiong于2010-07-20 12:48发表的  :
试了 行不通;在新的progressbarthread中使用从主窗口传递过来的m_pProgressbar(QProgressBar*  型),结果出错:
“can not sent event to object owned by  different thread”



首先,我没看懂你的进度条是如何体现你的计算进度的。

如果你前面的 while 和 sleep 确实是你所谓的进度,简单改用 QTimer 即可。

题外:线程间通讯,最好直接用Qt的信号与槽机制
离线erlangxiong
只看该作者 6楼 发表于: 2010-07-20
试了 行不通;在新的progressbarthread中使用从主窗口传递过来的m_pProgressbar(QProgressBar*  型),结果出错:

“can not sent event to object owned by  different thread”
离线erlangxiong
只看该作者 5楼 发表于: 2010-07-20
想了一下,要不停的显示进度条,放在主线程会卡住。实在想不出其他办法了,那么另起一个线程做进度条的显示我想应该就不会卡了吧,试试看。。。。
呵呵。。。
离线erlangxiong
只看该作者 4楼 发表于: 2010-07-20
大神啊,谢谢!~我把进度条那段也就是:
   while (this->isRunning())
   {
   progressBarValue += 8;
   progress.setValue(progressBarValue % 100);
   QThread::msleep(100); //注意:
   }
注释后果然不卡了!~!~
但新的问题出来的,我刚才试图把进度条的控制也放在run()中,但显然QT不允许这样做,报了一个不能再子线程实用微件的错;
如果我还想显示进度条有什么好的办法么,,麻烦指点了!~!~
离线dbzhang800

只看该作者 3楼 发表于: 2010-07-20
引用第2楼erlangxiong于2010-07-20 09:57发表的  :
不是啊 这个while是在计算线程里的啊 ,为的是确保计算完毕。



对QThread的基本概念认识有误,run函数才是在新线程内,其他都在主线程!
离线erlangxiong
只看该作者 2楼 发表于: 2010-07-20
不是啊 这个while是在计算线程里的啊 ,为的是确保计算完毕。
离线dbzhang800

只看该作者 1楼 发表于: 2010-07-19
引用楼主erlangxiong于2010-07-19 21:10发表的 多线程应用,主界面假死的问题。 :
   while (this->isRunning())
   {
   progressBarValue += 8;
   progress.setValue(progressBarValue % 100);
   QThread::msleep(100); //注意:
   }


你这主线程中放置while循环,而且还调用 sleep,界面不死才怪了
快速回复
限100 字节
 
上一个 下一个