0

私はマルチスレッドQTプロジェクトに取り組んでいます。主な問題は、シリアルコントローラクラスにあります。このクラスは、QMutexおよびQWaitConditionを使用して、書き込みメソッドと読み取りメソッドを構文化します。

問題は、親のqwaitcondition待機メソッドが原因で子クラスでブロックされたシグナルに関するものです。waitメソッドが戻ると、childrenクラスのシグナルが送信されます(レシーバーはchildrenクラスでもあります)。

このメソッド(qwaitcondition-wait)は、アプリケーション全体で信号の放出をブロックしていると思います。

問題はそのようなものです:

constructor()
{
    anotherclass = new MyClass;
}
void run()
{
   forever
   {
       if(readmethod())
            waitcondition.wakeall();
   }
}

void method1()
{
      sendpacket();
      mutex.lock();
      if(waitcondition.wait(&mutex,10000))
         //somecode;

      mutex.unlock();
}

class MyClass
{
   someObject sobj;
    MyClass()
    {
        connect(sobj,SIGNAL(somesignal),this,SLOT(someslot));
    }

    void someslot()
    {
        //some code
    }
}

someslotと呼ばれる私のスロットは、タイムアウト(この場合は10秒)のためにqwaitconditionが戻ると呼び出されます。

アプリケーション全体ではなく、このクラスでmutexとqwaitconditionを使用したいだけです。メインスレッドで子クラスをインスタンス化しようとしましたが、同じ動作が得られました。

概念テスト

テストプロジェクトを作成し、次のリンクで公開しました: testwaitconditionproject

テストプロジェクトは次のように機能します。親スレッドで10秒に等しいタイムアウトで待機条件が開始されます。子スレッドは2秒ごとに信号を送信し、内部スロットは親によってキャプチャされた信号を送信する必要があります。親スロットが呼び出されると、フラグがtrueに設定されます。このフラグは、待機状態を終了するためにwakeallを起動する必要があります。

ただし、子の内部信号は、待機条件のタイムアウト後にのみ発生します。これが私の主な問題です。親の待機条件が私の子供の信号をブロックしています。

編集:

テストプロジェクトで問題を解決し、別のスレッドでwaitconditionを使用してメソッドを呼び出しました。メソッドへの非同期呼び出しがスレッド1で(dbusを介して)発生するため、問題を再現することはできません。dbus呼び出しはスレッド1で発行されるので、インスタンスが同じスレッドに属している間は、childrenクラスのイベントは発行されません。

編集2:

pparentと子を中間クラスqthreadに入れるという問題を解決しました。それらはrunメソッドでインスタンス化され、exec呼び出しも使用されました。

4

1 に答える 1

1

イベントを処理するために必要な QCoreApplication イベント ループを実行していないようです。QCoreApplication::exec() がイベント ループをブロックする前に write() が呼び出されます。さらに、イベントループを持つスレッド内にすべての QThread オブジェクトを作成することが重要なようです (そのようなオブジェクトからのシグナルを使用する場合)。私はあなたの例を手に入れ、pparentを実行する(そしてQCoreApplication::exec()のブロックを解除する)追加のスレッドを作成しましたが、うまく機能します。

于 2011-06-20T08:44:26.427 に答える