スレッドの変遷のメモ
スレッドの構成の変遷について
----------------------------------------------------------------------------------
[最初のバージョン]
----------------------------------------------------------------------------------
シングルスレッドバージョンでした。1つのスレッド内で以下を行います。
1,キーボード、マウスのコントロール情報の送受信
2,JPEGファイルデータの受信、JPEGファイルの描画
3,PCMデータの受信、サウンド再生バッファへの転送
1つのスレッド内で非同期に行いますが、一度に1つの処理しかできないので、JPEGファイルデータの描画を待っている間はPCMデータのサウンド再生バッファへの転送が待たされるため、音が途切れる現象が発生しました。
----------------------------------------------------------------------------------
[3つの通信を別スレッドに分けたバージョン]
----------------------------------------------------------------------------------
キーボード、マウスのコントロール情報の送受信で1つのスレッド、JPEGファイルデータの受信、JPEGファイルデータの描画で1つのスレッド、PCMデータの受信、サウンド再生バッファへの転送で1つのスレッド、計3つのスレッドを設けました。
各スレッドは、マルチスレッドで動作するので、JPEGデータの描画を待たずに、PCMデータの転送が行えるのでノイズを回避出来ます。が、QTcpSocketを複数のスレッドで生成して送受信するため、正確なデータが受信できないことがあり、不正なJPEG、PCMデータを受信してしまい、結局デスクトップ画像も、サウンドもノイズが入ってしまうという結果になりました。
----------------------------------------------------------------------------------
[ネットワーク通信だけを行うスレッドとPCMデータのサウンド再生バッファへの転送を行うスレッド]
----------------------------------------------------------------------------------
ネットワーク通信を行うスレッドは1つであるのが望ましい、但しJPEGデータの描画を行うスレッドとPCMデータをサウンド再生バッファへ転送するスレッドは分けたい、ということで2つのスレッドでの構成にしました。データの送受信が正確にでき、JPEGファイルデータの描画とPCMデータの転送が効率よく行えます。
きれいな構成としては、JPEGファイルデータの描画も別スレッドにするのがいいのですが、あまりスレッドを設けすぎるのも問題ですね、たぶん。
(追記)
ネットワーク通信を行うスレッド中からJPEGデータの描画を行う処理も別スレッドで分離する必要があるようです。同じスレッドで処理している現在の構成では、PCMデータの再生にデータ転送が間に合っていません。
困りました…
----------------------------------------------------------------------------------
とりあえず現在は以下の3スレッド構成です。
----------------------------------------------------------------------------------
1, ネットワーク通信を行うスレッド
3つのソケットを接続し、キーボード/マウス情報送信、JPEGファイルデータ、PCMデータの受信のみを行います。JPEGファイルデータ、PCMデータはリングバッファへの転送まで行います。キーボード/マウス(コントロール)情報の送受信のみ同じスレッド内で行います。
2, JPEGファイルデータ描画を行うスレッド
リングバッファから1枚ずつJPEGファイルデータを取り出し、描画します。リングバッファが空ならなにもしません。
3,PCMデータの再生を行うスレッド
タイマーを使って、定期的にリングバッファからPCMデータを取り出し、再生用のバッファへ転送します。再生用のバッファが空になると音が途切れてしますので、途切れないように転送する必要があります。
« キーボードコントロールを実装しました その4 | トップページ | スレッドの変遷のメモ その2 »
コメント