定时器让UI无响应?

时间:2012-10-16 23:24:48

标签: multithreading performance qt timer signals

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

我已经计算出运行该功能的时间很短。当计时器设置为1000毫秒时,UI响应速度很慢。

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

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

为什么计时器导致用户界面缓慢且无响应?一个线程会更轻,消耗更少的CPU时间吗?我该如何解决这个问题?

    initTimer()
    {
        refreshTimer = new QTimer(this);
        connect(refreshTimer, SIGNAL(timeout()), this, SLOT(refreshDisplay));
        refreshTimer->start(1000);
    }
每隔1000毫秒刷新一次刷新槽函数:

    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中的图标和文本。此外,我已经使数据静态,但仍无法修复它。     (我已经测试了这个功能,几乎没有时间消耗......)

1 个答案:

答案 0 :(得分:1)

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