私は現在の仕事で複雑なプログラムを継承しており、QTcpSocketを経由してくるデータの流れからイメージのちらつきを減らそうとしています。QTcpSocket経由のデータストリームから複雑なアルゴリズムを連続して実行するための最適なQTスレッディングソリューションは何ですか?
プログラムは連続したデータストリームを受け取り、それを処理してからpaintEventで画面にペイントします。
処理機能は、信号がQTcpSocketからのreadyread()であり、スロットがデータ処理機能である信号/スロット接続に基づいて実行されます。ストリームは連続的なので、この信号/スロットは着信データに基づいてスクリーン上のペイントされた画像を連続的に発射し更新する。
イメージが瞬時にちらつき、メインイベントループの処理がデータストリームに干渉している可能性があるので、私の考えはデータ処理機能を独自のスレッドに入れることでした。このデータ処理関数は、プログラムの他の機能に完全に統合されているため、この時点でデータストリームをサブクラス化して、QThreadを適用することはできません。また、プログラム全体の完全なリストアになります。 。
だから、私の考えはそうのようなQtConcurrentを使用していた:
connect(tcpSocket2, SIGNAL(readyRead()), this, SLOT(getData()));
だから私は(SLOTを置き換え:のgetData()はreadyread()信号に接続されたデータ処理機能である
void MainWindow::getDataThread(){ //implemented as a slot
wpFuture = QtConcurrent::run(this, &MainWindow::getData);
}
getData())とSLOT(getDataThread())を使用して、グローバルスレッドプールから取得された新しいスレッドでデータ処理関数を実行できるようにします。ストリームは連続しているので、getData処理関数が実行されるたびに常に新しいスレッドが割り当てられていると思います。ちらつきを減らすように見えますが、約30〜60秒後にプログラムはランダムにクラッシュし、特定の吹き出しは発生しません。
私の質問は:データストリームをサブクラス化せずに、自分のデータ処理機能をスレッドするためのより良い方法はありますか?この特定の状況でQtConcurrentを実装する際に私の思考や理解が間違っていますか?
ありがとうございます。
通常、ダブルバッファリングでちらつきが解決されます。https://doc.qt.io/archives/qq/qq06-flicker-free.html – WindyFields
また、複数のスレッドから同時にMainWindow :: getDataを呼び出すと安全?あなたのプログラムがシングルスレッドだったのであれば、おそらくスレッドセーフではありませんでした。 – WindyFields
ありがとう、私はダブルバッファリングを確認します。複数のスレッドに関しては、ソケット上でデータが検出されるたびにQtConcurrent :: runが実行されていました。いったんQtConcurrentがスレッド上で関数を実行し、関数が完了すると、グローバルスレッドプールにスレッドを返すので、各反復は関数にスレッドを割り当て、スレッドを解放し、スレッドを割り当て、リリースします。これは、一度にMainWindow :: getData関数に対して実行されるスレッドが1つだけであることを意味します。私はこれが最善の方法ではないと考えています。 –