いくつかの Qt 遅延処理メソッド

組み込みソフトウェアの開発プロセスでは基本的に「遅延」が使用されますが、この記事ではQtの遅延処理方法をいくつか紹介します。

1. ブロッキング遅延

ブロックの原理は、遅延期間中、このスレッドのイベント ループを実行できないことです。

1. QThreadクラスのsleep()

最も単純な遅延方法は、QThread クラスの sleep(n)、msleep(n)、および usleep(n) を使用することです。これらの関数の望ましくない結果は、遅延期間中に GUI が応答を失い、インターフェイスがフリーズすることです。 , したがって、これら 3 つの関数は通常、非 GUI スレッドで使用されます。

QThread::msleep(50);//阻塞延时50ms

2. タイマーを使用: 死ぬまで待ちます

voidDelay_MSec_Suspend(unsignedintmsec)
{
QTime_Timer=QTime::currentTime().addMSecs(msec);
while(QTime::currentTime()< _Timer );
}

2. ノンブロッキング遅延

原則はイベント ループを使用することにほかならず、次の 2 つの原則があります。

1. このスレッドのイベントループを処理する

待機中は、ブロックされているすべてのイベントが処理され、プログラムが停止しないように、現在のスレッドのイベント ループに常に強制的に入ります。

voidDelay_MSec(unsignedintmsec)
{
QTime_Timer=QTime::currentTime().addMSecs(msec);
while(QTime::currentTime()< _Timer )
        QCoreApplication::AllEvents, 100);

2. サブイベントループを利用する

子イベント ループを作成します。子イベント ループでも、親イベント ループは引き続き実行可能です。

voidDelay_MSec(unsignedintmsec)
{
QEventLooploop;//定义一个新的事件循环
QTimer::singleShot(msec,&loop,SLOT(quit()));//创建单次定时器,槽函数为事件循环的退出函数
loop.exec();//事件循环开始执行,程序会卡在这里,直到定时时间到,本循环被退出
}

3. 時間のかかるコードの処理

このようなアプリケーション シナリオがあるとします。ボタンをクリックした後、画像を読み取って処理する必要があり、完了するまでに 20 秒かかります。

この 20 秒間、GUI はその効果を失い、インターフェイス上のどの要素もクリックできなくなります。この状況ではどうすればよいでしょうか? 1. 別のスレッドを使用してこの時間のかかるタスクを処理する; 2. 時間のかかるタスク中に、このスレッドのイベント ループを継続的に処理して、GUI のタイムリーな応答を確保します。

for(i=0;i< 1000000; i++)
{
    //QCoreApplication::AllEvents);    //去处理本线程的事件循环,避免本线程被堵塞
    QCoreApplication::AllEvents, 5);//如果不够频繁,可以增加第二参数来缓解卡顿
 
    for(j=0;j< 1000000; j++)
    {
        //QCoreApplication::AllEvents);//处理事件循环,不建议放在这里,可能过于频繁
        doSomeThing();
    }
}

一般に、 processEvents() はあまり頻繁に呼び出すべきではなく、またあまり頻繁に呼び出すべきではありません。頻度が高すぎると、スレッドの応答が向上する一方で、すでに時間のかかるタスクがさらに時間がかかることになります。頻度が十分でない場合は、明らかに GUI スレッドの応答を悪化させる可能性があります。たとえば、500 ミリ秒ごとに 1 回しか呼び出されない場合、GUI イベント ループは 500 ミリ秒ごとに 1 回しか処理できません。もちろん、この問題は、 processEvents(). より良いアプローチは、呼び出される期間が 200ms 未満であることを確認し (プログラムの要件に応じて、より小さい方が良い)、肉眼で目に見える遅れがないようにすることです。

副作用:(特に注意してください!)

1. ボタンをクリックすると、この 20 秒ほどの時間のかかるタスクが実行されます。完了する前に GUI の閉じるボタンをクリックすると、GUI はすぐに消えますが、この時間のかかるタスクは引き続き実行されます。完了するまでバックグラウンドが表示され、プロセスは終了します。解決策: シャットダウン イベントを書き換えて、シャットダウン イベントの関数内でプロセスを直接終了します。

2. ボタンをクリックした後、この 20 秒の時間のかかるタスクの実行が開始されます。実行が 5 秒目に達したら、もう一度ボタンをクリックすると、QT は新しい 20 秒のタスクを実行します。この新しいタスクが完了すると、タスクは続行されます。最後に中断された 5 秒目から最初の 20 秒タスクの実行を継続します。タスクがリエントラントであれば、結果は 2 回実行されるだけですが、タスクがリエントラントでない場合は、状況は完全に悪くなります。解決策: ボタンをクリックした後は無効にし、実行後に有効にします。

この記事の特典として、Qt 開発学習パッケージと技術ビデオ (Qt 実践プロジェクト、C++ 言語の基礎、C++ デザイン パターン、Q​​t プログラミング入門、QT シグナルとスロット メカニズム、QT インターフェイス開発) を無料で受け取ることができます。イメージ描画、QTネットワーク、QTデータベースプログラミング、QTプロジェクト実践、QSS、OpenCV、Quickモジュール、面接での質問など) ↓↓↓↓下記参照↓↓料金受け取りは記事下部をクリック↓↓

おすすめ

転載: blog.csdn.net/m0_73443478/article/details/133205248