1

タイマーを使用して信号を発信し、新しいデータに従って UI を更新するスロット関数を呼び出します。

その関数を実行する時間を計算したところ、かなり短いものでした。タイマーを 1000 ミリ秒に設定すると、UI の応答が非常に遅くなります。

その機能をスレッドに移動しようとしましたが、多くの機能が 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 のアイコンとテキストを変更するだけです。また、データを静的にしましたが、まだ修正できません。(私は機能をテストしましたが、ほとんど時間がかかりません...)

4

1 に答える 1

1

ありがとう、私はあなたの方法を使いました、そして最終的にCPUイーターを見つけました、それはsetIcon関数です。その前にifステートメントを追加し、データが変更されていない場合は呼び出しません。みんなありがとう!

于 2012-10-19T01:43:19.627 に答える