問題タブ [qeventloop]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
qt - 他のスレッドが大きなループでビジー状態になっているため、QTimer が遅延して起動する
環境の概要: qt で記述されたアプリケーションを実行するデバイスがあります。これには、データベース操作 (SQlite) を処理するメイン スレッドと、ネットワーク操作 (3G 経由) 用の別のスレッドがあります。メイン スレッド イベント ループは QCoreApplication::exec によって実行され、ネットワーク操作を処理する他のスレッドは QThread::exec によって実行されます。ところで、ソケット スレッド アフィニティは開始後に変更されます (例: moveToThread(socketThreadPtr))
問題の概要: データベースから約 10,000 レコードを選択するために、メイン スレッドがループでビジー状態になり、そのループに約 +30 秒かかります。ネットワーク スレッドには、期限が切れるたびにキープ アライブ メッセージを送信する必要がある 15 秒のタイマーがあります。問題は、timeout() シグナルのスロットがループの終了後にのみ実行されることです。
今までの解決策 (ただし、満足のいくものではありません): レコードを選択するループで QCoreApplication::processEvents を呼び出すと、問題は解決しますが、この回避策の代わりに解決策が存在するかどうか疑問に思います。
注意: キープアライブ メッセージを送信するコマンドを与えるタイマー、シグナル、およびスロットは、現在メイン スレッドで処理されます (ただし、読み取り/書き込みはネットワーク スレッドで行われます)。また、タイマーをネットワーク スレッドに移動しましたが、メイン スレッドにある場合と同じ結果が得られました。
c++ - スロット引数が (時々) 無効です
10〜20回のシグナル呼び出しの1つで、スロットに無効な引数があります。問題は次のように要約されます
QCoreApplication::notifyInternal2
これが発生した場合、 (たとえば)次のようなクラッシュ ダンプが表示され ます。
しかしevent->args
、無効のようです。
プラットフォームは Win64、qt のバージョンは 5.6.1、コンパイラは vs2015 です。リリース。何かご意見は?ありがとう。