2012-04-23 6 views
-1

これを行う方法を把握する際に問題が発生しています。私が最初にやろうとしていることを説明しようとします。同じスレッドでスロットを並列に呼び出すことはできますか?

まず、このクラスには読み取り専用ファイルが含まれています。このクラスは、この他のクラス(StorageProvider)を使用してこのファイルのブロックをアップロードします。そのクラスにはQNetworkAccessManagerが含まれています。ファイルのブロックをアップロードするときは、そのブロックをStorageProviderクラスに送信します。このクラスは、QNAMに送信するREST要求を使用します。 QNetworkReplyが完了すると、StorageProviderはこれをアップローダに通知します(そのブロックが完了したことがわかるようになります)。

アップローダ - > StorageProvider - > QNetworkAccessManager - >インターネット

これまでのところは良いですね。 QNAMで作成したリクエストでStorageHandlerが完了したときに聴くアップローダーにスロットを置くことができます。

QNAMはHTTP経由で同時に6つの要求を行うことができるので、StorageProviderがブロックで完了したことを通知し、独自のBlockIdが信号に接続されるようにしたいと考えていましたアップローダは、実行されたブロックだけでなく、完了したブロックを知ることができます。

これは、信号(blockId)がStorageProviderによって発行されるたびに呼び出されるスロットは、完了したIDを格納してから、アップロードされていない新しいものを探す必要があることを意味します(Forgot to mention私は既にアップロードされているIDのリストを持っているので、ID(0〜1000)を踏むときには、それも必要です。1.ファイルのインデックスを4MB前に送ります。2.すでに存在するブロックが入っている場合はブロックします。

私は「currentBlockId」を1つインクリメントするスロットを持っていて、次のものを見つけるまでアップロードすることができます。位置 "currentBlockId" * 4mb(ファイル内のインデックスはインデックスのように前方にプッシュされ、ランダムアクセスではありません。私たちが行っているファイルの終わりを言います)、このスロットは5つのアップロードのうちの1つが実行されるたびに呼び出されます。問題がありますか?私が質問しているのは、QNAMが別のスレッドで呼び出して、2〜5個の "finished()"シグナルが同時に出力され、同時にそれを処理するスロットを呼び出すということです?同様に、私はあまりにもその後何が起こるか分からない。私のコードはスレッド化されていないことに注意してください。理論的にはシグナルは正しくキューに入れられますか?そのスロットは次々に5回呼ばれるでしょうか?

ありがとう

+1

no。 1つのスレッド、1つのコードの実行。何か他のスレッドがあることを意味します。 – UmNyobe

答えて

1

うわー、私の目。それを一度読んで、あなたが望むものを手に入れないでください。だからここにスクープがあります。

デフォルトでは、スロットはイベントスレッドで呼び出されます。デフォルトでは、イベントスレッドは1つだけです。これに関して、あなたは正しいです。デフォルトでは、スロットがイベントスレッドを使用している場合、コールは後で待ち行列に入ります。

しかし、それは5つの呼び出しのすべてが必然的にあなたが望む順序、または同じスレッドから到着すると想定するのは安全ではありません。ファンシーで処理したいものを並行して処理したい場合(ポストが混乱することはありません)、QtConcurrent::run()を使用して、処理のために新しいスレッドを起動する方法の一例に過ぎません。このスキームでは、すべてのスロットがあなたのデータをキューにプッシュする(ミューテックスでそれを保護することを忘れないでください)QtConrrent :: run()関数を起動します。

+0

ごめんなさい。英語は私の第二言語であり、私が持っている状況は説明するのがかなり難しいです。それは彼らが到着する順序は問題ではありませんので、スロットが並行していない限り、incres doesntのインデックスは同時に2つのスレッドによって増加し、バッファimは2つのスレッド例えば(彼らに同じデータブロックを与えるかもしれない) – chikuba

+0

あなたの英語は大丈夫です!長い技術的な記事の中で、あなたが言っていることに従うのは難しいだけです。長い答えが短くなる:同じスレッドから同じ信号を毎回出すことが分かっていて、Qtの他のスレッド機能を使うような気がしないのなら、あなたの呼び出しは発行された順にキューに入れられます。今は難しい部分は、あなたが望む順番でそれらが放出されていることを保証しなければならないことです。これをインターネットI/Oの基礎としているなら、それは安全な仮定ではないかもしれません。 –

+0

はい、大丈夫です。私は彼らがインターネット上でやっていること(失敗、再試行などが必要)をコントロールすることができず、同じ手順を経ることになっています。だから私は安全な側にする必要があります:)私の唯一の懸念は、スレッド(これは私がコントロールできない)と要求されたことについてのすべてが、彼らが並行して停止した時を知っていませんでした – chikuba

関連する問題