Multithreading 计时器使UI无响应?

Multithreading 计时器使UI无响应?,multithreading,performance,qt,timer,signals,Multithreading,Performance,Qt,Timer,Signals,我使用计时器发出信号并调用slot函数,该函数根据新数据更新UI 我计算出运行该函数的时间非常短。当定时器设置为1000ms时,UI响应相当慢 我尝试将该功能移动到线程,但我发现这很困难,因为许多功能需要访问UI类的受保护值 我将尝试将计时器移动到另一个线程,并将更新功能保留在UI类(主窗口)中,但我不知道这是否有帮助 为什么计时器会导致UI变慢和无响应?线程是否会更轻,占用更少的CPU时间?我怎样才能解决这个问题 initTimer() { refreshTim

我使用计时器发出信号并调用slot函数,该函数根据新数据更新UI

我计算出运行该函数的时间非常短。当定时器设置为1000ms时,UI响应相当慢

我尝试将该功能移动到线程,但我发现这很困难,因为许多功能需要访问UI类的受保护值

我将尝试将计时器移动到另一个线程,并将更新功能保留在UI类(主窗口)中,但我不知道这是否有帮助

为什么计时器会导致UI变慢和无响应?线程是否会更轻,占用更少的CPU时间?我怎样才能解决这个问题

    initTimer()
    {
        refreshTimer = new QTimer(this);
        connect(refreshTimer, SIGNAL(timeout()), this, SLOT(refreshDisplay));
        refreshTimer->start(1000);
    }
每1000ms调用一次刷新插槽功能:

    void refreshDisplay()
    {
        ui->tableWidget->setUpdatesEnabled(false);

        for(int queue_i = size_1, index = 0; queue_i >= 0; queue_i--, index++)
        {
            LogInfoItem* logItem = (LogInfoItem*)logDisplayQueue.at(queue_i);

            QString BITS_str = bits2Hexs(logItem->BITS);


            ui->tableWidget->item(index, 0)->setText(logItem->time);//time
            ui->tableWidget->item(index, 1)->setText(logItem->name);//name
            ui->tableWidget->item(index, 2)->setText(BITS_str);//BITS

            if(queue_i == oldRowItemNo)ui->tableWidget->selectRow(index);
        }

        ui->tableWidget->setUpdatesEnabled(true);

        Q_FOREACH(Page* p, PageInfoList)
        {
            p->refresh();
        }

        Q_FOREACH(IconLabel* icl, iconLabelList)
        {
            icl->refresh();
        }
    }
“refresh()”所做的只是根据其中的数据更改ui中的图标和文本。此外,我已经将数据设置为静态,但仍然无法修复它。
(我已经测试了该函数,几乎不需要花费时间……

谢谢,我使用了您的方法,终于找到了cpu eater,它是setIcon函数。我在它前面添加了一个if语句,如果数据没有更改,则不会调用它。谢谢大家!

谢谢你,我用了你的方法,终于找到了cpu eater,它是setIcon函数。我在它前面添加了一个if语句,如果数据没有更改,则不会调用它。谢谢大家!

你能发布一些代码或者写一些示例代码来解决你的问题吗?我的猜测是,UI更新中的逻辑很慢,由计时器触发,导致计时器再次触发,从而创建一个事件队列。UI是在一段时间后变慢还是立即变慢?尝试删除
refreshDisplay()
中的所有UI更新代码,并将其替换为更新显示计数器的标签。这应该告诉您是UI更新代码导致了延迟,还是问题出在其他地方,比如其他一些消耗CPU的例程。线程不会有帮助,正如您提到的,您无论如何也不能从线程更新GUI内容。@Rubby:我想我们仍然没有足够的信息来帮助您。正如@Arnold指出的,如果
refreshDisplay()
真的像你所说的那样快,那么你的计时器可能不是问题所在。试着注释掉插槽的全部内容,然后慢慢地取消注释,直到事情再次变慢,从而缩小范围。在找到解决方案(如多线程)之前,请确保您已经找到了实际问题。:)谢谢你,我用了你的方法,终于找到了cpu eater,它是setIcon函数。我在它前面添加了一个if语句,如果数据没有更改,则不会调用它。谢谢大家!!你能发布一些代码或者写一些示例代码来解决你的问题吗?我的猜测是,UI更新中的逻辑很慢,由计时器触发,导致计时器再次触发,从而创建一个事件队列。UI是在一段时间后变慢还是立即变慢?尝试删除
refreshDisplay()
中的所有UI更新代码,并将其替换为更新显示计数器的标签。这应该告诉您是UI更新代码导致了延迟,还是问题出在其他地方,比如其他一些消耗CPU的例程。线程不会有帮助,正如您提到的,您无论如何也不能从线程更新GUI内容。@Rubby:我想我们仍然没有足够的信息来帮助您。正如@Arnold指出的,如果
refreshDisplay()
真的像你所说的那样快,那么你的计时器可能不是问题所在。试着注释掉插槽的全部内容,然后慢慢地取消注释,直到事情再次变慢,从而缩小范围。在找到解决方案(如多线程)之前,请确保您已经找到了实际问题。:)谢谢你,我用了你的方法,终于找到了cpu eater,它是setIcon函数。我在它前面添加了一个if语句,如果数据没有更改,则不会调用它。谢谢大家!!