1

昨日、データを受け取っていなかったのでこの質問をしましたが、奇妙なことに、デストラクタで待機を使用すると、から通知を受け取り始めましたQSocketNotifier。質問の残りの部分は同じです。誰かが何かを提案できますか?シリアル ポートからデータを読み取って処理する別のスレッドを開始するサンプル アプリケーションを作成しました。QSocketNotifierデータがシリアルポートに到着したかどうかを検出するために使用されます。exec()スレッドの実行関数内のステートメントを使用して、イベント ループを開始します。ただし、ソケット通知機能が動作したときにのみアプリケーションを実行している間は、シリアル ポート アクティベーションのシグナルは生成されません。一度生成されると、非常に高速に生成され、送信デバイスのフレーム レートと同等ではありませんでした。

シリアル コミュニケーター スレッドの簡単なコード サンプルを次に示します。

SerialPortWatchOne.cpp

//constructor
klass::klass()
{
//setport configuration
//miscellaneous initialization
QSocketNotifier* notifier = new QSocketNotifier(mPort->GetFileDescriptor, QSocketNotifier::Read,this);
connect(notifier,SIGNAL(activated(int)),this,SLOT(ReadAndProcessData()));
}

void klass::run()
{
exec();  //this starts an event loop where by Qt signal handling is enabled
}

void klass::ReadAndProcessData()
{
      FlushBuf();      
      int bytes_read=mPort->ReadPort(mBuf,1000);
      if(bytes_read>0)
         //Process data
}

~klass::klass()
{
//desctruction code;
wait();  //so that thread cleanly releases all resources before exit
}

注: klass はスレッドであり、GUI スレッドのメンバーであり、GUI スレッド c'tor でインスタンス化されます。GUI は定期的にウィジェットを klass スレッドからのデータで更新します。

誰が問題が何であるかを提案できますか? 誰かが前にこれをやったことがありますか。

4

1 に答える 1

0

頭に浮かぶ唯一のことは、スレッドQSocketNotifier * socketNotifierで実行されているイベントループなしで使用していることです。socketNotifier->thread()イベント ループが実行されていない場合、イベント処理は行われません。イベント処理がないということは、 からシグナルが発せられないことを意味しQSocketNotifierます。ただし、別のスレッドを使用している場合は、とにかくブロッキング I/O 呼び出しを使用することをお勧めします。

于 2009-07-21T16:45:56.853 に答える