0

環境の概要: qt で記述されたアプリケーションを実行するデバイスがあります。これには、データベース操作 (SQlite) を処理するメイン スレッドと、ネットワーク操作 (3G 経由) 用の別のスレッドがあります。メイン スレッド イベント ループは QCoreApplication::exec によって実行され、ネットワーク操作を処理する他のスレッドは QThread::exec によって実行されます。ところで、ソケット スレッド アフィニティは開始後に変更されます (例: moveToThread(socketThreadPtr))

問題の概要: データベースから約 10,000 レコードを選択するために、メイン スレッドがループでビジー状態になり、そのループに約 +30 秒かかります。ネットワーク スレッドには、期限が切れるたびにキープ アライブ メッセージを送信する必要がある 15 秒のタイマーがあります。問題は、timeout() シグナルのスロットがループの終了後にのみ実行されることです。

今までの解決策 (ただし、満足のいくものではありません): レコードを選択するループで QCoreApplication::processEvents を呼び出すと、問題は解決しますが、この回避策の代わりに解決策が存在するかどうか疑問に思います。

注意: キープアライブ メッセージを送信するコマンドを与えるタイマー、シグナル、およびスロットは、現在メイン スレッドで処理されます (ただし、読み取り/書き込みはネットワーク スレッドで行われます)。また、タイマーをネットワーク スレッドに移動しましたが、メイン スレッドにある場合と同じ結果が得られました。

4

2 に答える 2