2012-05-08 12 views
1

QTが新しく、次の問題が発生しました。ファイルをHTTP経由で読み込んでいます

QFile file("book.gif"); 
QHttp http; 
if (file.open(QIODevice::WriteOnly)) 
{ 
    http.setHost("www.geocities.com"); 
    http.get("/mslerm/images/qtbook.gif", &file); 
    QMessageBox msgBox; 
    msgBox.setText(http.errorString()); 
    msgBox.exec(); 
    http.close(); 
    file.close(); 
} 

任意のアイデア:すべてが正常に動作します - HTTP呼び出しのメッセージボックスを閉じる前に

QFile file("book.gif"); 
QHttp http; 
if (file.open(QIODevice::WriteOnly)) 
{ 
    http.setHost("www.geocities.com"); 
    http.get("/mslerm/images/qtbook.gif", &file); 
    http.close(); 
    file.close(); 
} 

しかし、もし:

ダウンロードは空のファイルを返しますか?

答えて

4

問題は、ドキュメント自体で述べたようにのget()メソッドが非ブロッキングであるということである:続行する Qhttp.get

一つの方法は、とQHttp :: dataReadProgress信号を接続することですスロット QHttpオブジェクトから受信したデータを処理する場所を開発します。 はまた、両方QHttpとQFtpクラスが廃止され、使用するクラスを示唆したことを覚えていることは、次のとおりです。

QNetworkAccessManager
QNetworkRequest
QNetworkReply

+1

詳細な回答ありがとうございます – mmatviyiv

3

コールバックをQHttp終了信号に接続し、そこでファイルハンドラを閉じる必要があります。メッセージボックスを作成すると、ポップアップから閉じて、メッセージボックスを閉じてから、ダウンロードが完了し、ファイルハンドラを正しく閉じることができます。鍵は、QMessageDialog :: execメソッドが同期していることです。

0

メッセージボックスがQHttpの()の幹部にイベントループを回転させるとことができます非同期処理が発生します。イベントループは、転送を開始してから結果が出るまでの間に実行する機会が必要です。

理想的には、転送を開始し、QHttpのrequestFinished(...)信号に接続されたスロットで結果を処理する必要があります。転送が開始されると、コードはイベントループに戻る必要があります。

クイックハックとして、QCoreApplication::processEvents(QEventLoop::AllEvents, time)を呼び出すことができます。ここで、timeは、http転送に必要な最大ミリ秒数です。これは貧弱なスタイルとみなされ、悪影響を及ぼします。 1つは、転送を開始するコードを再入力することができます。たとえば、ボタンクリックスロットで転送を開始し、転送が完了する前にユーザーが再度クリックするとします。

要求/応答関数の連鎖を持つ非同期のイベントベースのプログラミングスタイルを採用する必要があります。要求関数は時間がかかることを開始し、応答関数は結果を処理します。面倒なように聞こえるかもしれませんが、それは応答性の高いアプリケーションを作成する唯一の方法です。そのようなコードは通常QObjectに存在し、シグナル/スロット接続(スロットの直接呼び出しはありません)によってイベントまたはを処理することによってすべての処理が行われた場合、別のスレッドに簡単に移動してパフォーマンスをさらに向上させ、混合された系統のGUIスレッド休止の影響を軽減します。

関連する問題