0

Qt 4.8、Windows XP:

TCPメッセージを管理し、適切なタイミングでソケットを開いたり、維持したり、閉じたりするスレッドがあります。

この同じスレッドは、私のスレッドのデータで定義されている200ミリ秒のQTimerを開始します。これは、ソケットが開いている場合に、スレッドのクラスでイベントをポンピングします。したがって、タイマーとそのイベントはスレッドに属します。私が最もよく理解しているのはその考えです。

QTimerタイムアウトイベントは、スレッドに属するポートを介してTCPメッセージを送信します。これは、この特定のハードウェアアイテムのキープアライブメッセージです。定期的に送信する必要があります。そうしないと、デバイスが「消えて」しまいます。

メッセージが送信されると、次のエラーが発生します。

「QSocketNotifier:ソケット通知機能を別のスレッドから有効にすることはできません」

私の知る限り、私同じスレッドからメッセージを送信しており、シグナルなどはそれによって所有/処理されることなどを期待しています。

誰かが私がここで欠けているものを教えてもらえますか?

PS:メッセージ送信され、デバイス存続します... Qtエラーコンソールでこのランタイムエラーが発生しているだけで、それが原因で内部の問題が潜んでいるのではないかと非常に心配しています。

このメッセージは、OSX10.6で実行されている場合は発生しません。どうしてか分かりません。

4

1 に答える 1

3

はい、これがスクープです。QTimerは、QTの設計者だけが知っている理由で、スレッドの親のコンテキストを継承します。起動元のスレッドのコンテキストではありません。したがって、タイマーがオフになり、呼び出されたスロットからメッセージを送信すると、スレッドのコンテキストではなく、親のコンテキストになります。

また、そのスレッドの子であるスレッドを起動することはできないため、実際に必要なスレッドに含まれるタイマーを起動できます。Qtはそれを実行させません。

したがって、メモリを消費し、キューを作成し、他の場所からメッセージをキューにロードし、TCPポートを所有するスレッドのキューを監視し、yaがemを取得したときにemを送信します。それはうまくいきます。

于 2012-05-30T01:58:39.393 に答える