2016-05-30 14 views
0

私は少し問題に遭いましたが、どうすればいいのか分かりません。Qtプロセス指定した時間より長いイベント処理

Qt 4.8.6、Qt creator 3.3.2、Debian 7カーネル3.8.13を実行しているBeaglebone BlackにUbuntu 12.04のクロスコンパイル環境を実行しています。

私が見ている問題は、このコードということである:それはQtのドキュメント(少なくとも私の解釈)に応じなければならないよう

if (qApp->hasPendingEvents()) 
{ 
    qDebug() << "pending events"; 
} 
qApp->processEvents(QEventLoop::AllEvents, 10); 

は機能しません。私は、プロセスイベントループが指定された10ミリ秒のAT MOSTで機能することを期待しています。

qDebugステートメントは決して印刷されません。したがって、処理されるイベントはないと予想し、プロセスイベントステートメントは非常に早く出入りします。ほとんどの場合、これが当てはまります。

qDebugステートメントはスキップされ、processEventsステートメントは1秒から2秒の間実行されます(たびに頻繁ではありませんが)。

プロセスイベントで何が起きているのかを突き止め、何が原因で遅延が発生しているのかを調べる方法はありますか?

+0

コードの残りの部分は表示されませんが、疑似同期スパゲッティコードを作成しているように見えます。あなたは、これらの1〜2秒間ブロックするような操作を実行しています。イベントループを再入力すると、既存のタイムアウトは無視されます。この 'processEvents'が' processEvents'を再度呼び出すコードを呼び出すと、あなたは困っています。一般的に言えば、 'processEvents'呼び出しを使わずにクリーンな非同期コードを書くことができます。 –

+0

一般的に言えば、一定時間後に制御を取り戻す場合は、タイマーを使用する必要があります。リエントラントの問題、または処理に時間がかかりすぎるシステムイベントで戦うことはありません。あるいは、少なくとも、あなたが望むようにコードを制御し続けるためにできる最大の努力をするでしょう。 –

答えて

0

Qtは、QApplication::processEventsのシステムコールで指定されたより長いイベントを処理しています( システム)。 プロセスイベントで何が起こっているのかを掘り下げて、何が原因で遅延が発生しているのか調べる方法はありますか?

はい、Qtのソースコードを参考にしてください。ソースコードは多分どこかその周り/home/myname/software/Qt/5.5/Src/qtbase/src/corelib/kernel/qeventdispatcher_unix.cppであるか:

bool QEventDispatcherUNIX::processEvents(QEventLoop::ProcessEventsFlags flags) 
{ 
    Q_D(QEventDispatcherUNIX); 
    d->interrupt.store(0); 

    // we are awake, broadcast it 
    emit awake(); 

    // This statement implies forcing events from system event queue 
    // to be processed now with doSelect below 
    QCoreApplicationPrivate::sendPostedEvents(0, 0, d->threadData); 

    int nevents = 0; 
    const bool canWait = (d->threadData->canWaitLocked() 
          && !d->interrupt.load() 
          && (flags & QEventLoop::WaitForMoreEvents)); 

    if (canWait) 
     emit aboutToBlock(); 

    if (!d->interrupt.load()) { 
     // return the maximum time we can wait for an event. 
     timespec *tm = 0; 
     timespec wait_tm = { 0l, 0l }; 
     if (!(flags & QEventLoop::X11ExcludeTimers)) { 
      if (d->timerList.timerWait(wait_tm)) 
       tm = &wait_tm; 
     } 

     if (!canWait) { 
      if (!tm) 
       tm = &wait_tm; 

      // no time to wait 
      tm->tv_sec = 0l; 
      tm->tv_nsec = 0l; 
     } 
     // runs actual event loop with POSIX select 
     nevents = d->doSelect(flags, tm); 

システムがqApp->hasPendingEvents()計上されていないイベントを掲載思えます。そして、QCoreApplicationPrivate::sendPostedEvents(0, 0, d->threadData);は、処理するイベントをd->doSelectでフラッシュします。私がこの作業を解決していた場合、投稿されたイベントにフラッシュするか、flagsのパラメータにQEventLoop::WaitForMoreEventsビットが設定されているかどうかを確認します。私は通常、ソースコードからQtをビルドするか、シンボル/ソースへのパスをデバッガに提供して、そこで掘り下げることが可能です。

P.S. Qt 5.5.1ソースイベント処理コードを見てみましたが、それはあなたが扱うものと非常によく似ているはずです。あるいはその実装は実際にはbool QEventDispatcherGlib::processEvents(QEventLoop::ProcessEventsFlags flags)でしょうか?実際のシステムで見つけるのは簡単です。

関連する問題