-
27-09-2019 - |
質問
ファイルのコンテンツをサーバーにアップロードするアプリケーションに取り組んでいます。
ファイルをサーバーにアップロードするには、「QNetWorkAccessManager」クラスを使用しています。非同期の方法として機能するため、Qeventloopを使用して同期的な方法として機能するように変更しました。
Class FileTransfer
{
Public :
QNetworkAccessManager mNetworkManager;
Void Upload(QNetworkRequest request, QIODevice *data)
{
responce = mNetworkManager.put(request, data);
EventLoop.exec();
ReadResponce(responce);
}
Void Stop()
{
responce ->close();
}
}
私のサンプルアプリケーションには、2つのウィンドウがあります。ファイルを選択するには、進捗を示すために2番目に選択します。
ユーザーが最初のウィンドウのアップロードボタンをクリックすると、2番目のウィンドウが表示され、次に作成します。 filetransfer オブジェクトと起動アップロード。
ユーザーがフォームを閉じた場合、ファイルをアップロードしている間、ウィンドウの破壊者で停止を呼び出します。filetransfer「その後、私は削除します」filetransfer' 物体。
しかし、ここで アップロード() 機能はまだ完了していないため、クラッシュします。
私を助けてください:待つ方法 '止まる()upload()関数が完了するまで機能
解決
私があなたのコードから見ることができるものから、あなたはQeventloopを実行していますが、実際にその「終了」スロットを任意の信号に接続していません。以下を例として考えてみましょう。ログインはQHTTPであり、コードは別のものから取得されますが、原則は適用されます。
/* Create the QEventLoop */
QEventLoop pause;
/* connect the QHttp.requestFinished() Signal to the QEventLoop.quit() Slot */
connect(&login, SIGNAL(requestFinished( int, bool )), &pause, SLOT(quit()));
/* The code that will run during the QEventLoop */
login.request(header,&logmein,&result);
/* Execute the QEventLoop - it will quit when the above finished due to the connect() */
pause.exec();
これは、私が間違っていない場合、このようにあなたのコードに適用できます...
/* connect the signal to the relevant slot */
connect(&mNetworkManager, SIGNAL(finished( QNetworkReply )), &EventLoop, SLOT(quit()));
/* Execute the code that will run during QEventLoop */
responce = mNetworkManager.put(request, data);
/* Execute the QEventLoop */
EventLoop.exec();
私があなたの質問を間違えた場合、お詫びします!私は休憩後に再びQTを握るだけですが、これがあなたの意味だと思います!幸運を!
他のヒント
アップロード関数にそのようなものを追加する必要があると思います:
if (upf->openFile())
{
reply = manager->post(request, upf);
connect(reply, SIGNAL(uploadProgress(qint64,qint64)), this, SIGNAL(progress(qint64,qint64)));
connect(reply, SIGNAL(finished()), this, SLOT(replyFinished()));
isInProgress = true;
emit started();
} else
{
emit finished(true, false, tr("Error: can't open file %1").arg(filename));
}
これが全文コードです: DataCod-QT-Tools
それが助けてくれることを願っています。
個人的には、これらの回答を使用しないことをお勧めします。カウントダウンラッチを信号に接続するだけで十分でしょう。
だからあなたは書くことができます:
Latch latch( 1 );
QObject::connect( reply, SIGNAL(finished()),
&latch, SLOT(countDown()) );
latch.wait();
このためには、ラッパーが必要です。
class Latch : public QObject {
Q_OBJECT
public:
Latch( uint count );
void wait();
public slots:
void countDown();
private:
gcl::countdown_latch _latch;
};