• 6110阅读
  • 4回复

[提问]QT多线程的执行效率很低是什么原因? [复制链接]

上一主题 下一主题
离线weilp
 
只看楼主 倒序阅读 楼主  发表于: 2012-12-24
最近用QT写界面,由于程序在处理过程中有一步比较耗时,为了让程序在这期间更好的响应UI操作,我想用开个新线程来实现这个耗时操作的计算,而GUI线程来继续响应UI操作,但是遇到了这样一个问题,我发现,同样的代码,直接在主线程里调用和在新的QThread里调用的执行效率相差很远,因此我写了个测试函数,如下:

void MainWindow::onClicked()
{
    m_pWorkThread->start(QThread::TimeCriticalPriority);  //通过QThread的run函数调用doSomethingHeavy()
//    doSomethingHeavy();                                                     //直接从MainWindow调用doSomethingHeavy()

}

如果直接从MainWindow里调用doSomethingHeavy(),效率还比较高,但程序执行计算期间,无法及时响应UI操作,但如果从m_pWordThread(继承自QThread)的run函数里调用doSomethingHeavy() 的话,效率就特别差,不知道谁有没有遇到过相似的问题或者知道怎么解决这个问题的,还请多多指教,在些先谢过各位了!
离线jdwx

只看该作者 1楼 发表于: 2012-12-24
多线程基本上不会改变效率,除了下载一类的操作。
像读写文件的程序本身速度就卡在硬盘上,开几个线程也不会快。
所以说多线程基本上就是不让界面卡住。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线weilp
只看该作者 2楼 发表于: 2012-12-24
你好,以下是我的测试代码:

//之前已经连接信号槽:QObject::connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(onClicked()));
void MainWindow::onClicked()
{
    m_pWorkThread->start(QThread::TimeCriticalPriority);
//    doSomethingHeavy();
}

void MainWindow::doSomethingHeavy(void)
{
    const int n=100000000;

    for(int i=0;i<n;i++)
    {
        ui->progressBar->setValue((double)i/n*100);
        for(int j=0;j<n;j++)
        {
            double tmp=i*i+j*j;
        }
    }
}

//QWorkThread继承自QThread
void QWorkThread::run ()
{
    const long n=100000000;

    for(long i=0;i<n;i++)
    {
        if(i%1000000)
            emit completePercentage((double)i/n);
        for(long j=0;j<n;j++)
        {
            double tmp=i*i+j*j;
        }
    }

    emit completed();
}

两个基本相同的函数在主线程执行和新开的线程执行,效率差别很大,但依你的观点不应该有这样的差别,我一直想不明白其中的原因,还望多多指教!
离线jdwx

只看该作者 3楼 发表于: 2012-12-24
回 2楼(weilp) 的帖子
emit completePercentage((double)i/n);
据有人试验过(不是我),信号和槽调用一次需要15ms(要不就是1.5ms)左右,不是完全的不要时间,你可以试试去掉emit部分,之后消耗的时间。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线weilp
只看该作者 4楼 发表于: 2012-12-24
回 3楼(jdwx) 的帖子
十分感谢!刚刚试验了一下,确实是这个引起的问题,之前我试过这么做,只是去掉这个之后基本上瞬时就完成了这个操作,让我觉得有点不太相信,刚刚我把主线程中设置进度条的操作也注释后再试了下,基本上也是瞬间就完成了,应该就是这里的问题了,真的很感谢你!btw, merry Xmas eve!
快速回复
限100 字节
 
上一个 下一个