11

ファイルのコンテンツをサーバーにアップロードするアプリケーションに取り組んでいます。

ファイルをサーバーにアップロードするには、「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 つのウィンドウがあります。1 番目はファイルを選択し、2 番目は進行状況を表示します。

ユーザーが最初のウィンドウでアップロード ボタンをクリックすると、2 番目のウィンドウが表示され、FileTransferオブジェクトを作成してアップロードを開始します。

ユーザーがフォームを閉じた場合にファイルをアップロードしているときに、ウィンドウのデストラクタで「<em>FileTransfer」の停止を呼び出し、その後「<em>FileTransfer」オブジェクトを削除します。

しかし、ここではUpload()関数がまだ完了していないため、クラッシュします。

私を助けてください: Upload() 関数が完了するまで'stop() ' 関数で待機する方法

4

3 に答える 3

19

あなたのコードからわかることから、あなたは 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を理解するようになっただけですが、これがあなたの言いたいことだと思います! 幸運を!

于 2010-06-16T10:37:17.180 に答える
0

アップロード機能にそのようなものを追加する必要があると思います:

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

それが役立つことを願っています。

于 2010-06-16T10:13:35.463 に答える
0

個人的には、これらの回答を使用しないことをお勧めします。カウントダウン ラッチを信号に接続するだけで十分です。

したがって、次のように書くことができます。

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;
};
于 2013-06-28T13:28:19.630 に答える