-1

これを行う方法を理解するのに問題があります。私が最初にやろうとしていることが何であるかを説明しようとします。

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

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

これまでのところ良いですよね?StorageHandlerがQNAMで行った要求で完了したときにリッスンするスロットをアップローダーに配置するだけで済みます。

ただし、QNAMはHTTPを介して同時に6つのリクエストを実行できるため、StorageProviderがブロックで完了したことを通知し、一意のBlockIdがその信号に接続されて、アップローダーが許可されるようにすることを考えていました。実行されたブロックだけでなく、実行されたブロックを知ること。

これは、信号(blockId)がStorageProviderによって発行されるたびに呼び出されるスロットが、実行されたIDを保存してから、アップロードされていない新しいIDを探す必要があることを意味します(すでにアップロードされているIDのリストなので、ID(0 ... 1000)をステップスルーするときは、次のことも行う必要があります。1.ファイルのインデックスを4mb前方にプッシュします。2。既存のブロックのリストをチェックインします。の。

だから、私の質問は次のとおりです。アップロードできる次のスロットが見つかるまで「currentBlockId」を1つ増やすスロットがあり、「currentBlockId」* 4mb(インデックス)の位置になるまでファイルを4mbずつ読み取ります。ファイル内はインデックスのように進められ、ランダムアクセスにはなりません。このインデックスがファイルの最後に到達すると、完了します)、5つのアップロードのいずれかが実行されるたびにこのスロットが呼び出されます。問題が発生しますか? ?私が尋ねている理由は、QNAMが異なるスレッドで呼び出しを行うため、2〜5個の「finished()」シグナルが同時に発行され、それを処理するスロットが同時に呼び出されるためです。 ?同様に、私はその時何が起こるかよくわかりません。私のコードはどれもスレッド化されておらず、理論的にはシグナルは正しくキューに入れられるべきであることに注意してください。スロットは次々と5回呼び出されますか?

ありがとう

4

1 に答える 1

1

うわー、私の目。それを一度読んでも、あなたが望むものをまだ理解していない...だからここにスクープがあります。

デフォルトでは、スロットはイベントスレッドで呼び出されます。デフォルトでは、イベントスレッドは1つだけです。この点で、あなたは正しいです。デフォルトでは、スロットがイベントスレッドを消費している場合、呼び出しは後でキューに入れられます。

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

于 2012-04-23T22:33:10.743 に答える