[解決済み] QTimer::singleShot(0, object SLOT(obj_slot())) は何をするのですか?
質問
私はQtを学んでいる初心者です。 例 をダウンロードすることができます。で ダウンロードマネージャ.cpp であり、メンバ関数は以下の通りである。
void DownloadManager::append(const QUrl &url)
{
if (downloadQueue.isEmpty())
QTimer::singleShot(0, this, SLOT(startNextDownload()));
downloadQueue.enqueue(url);
++totalCount;
}
-
私は、なぜ
downloadQueue
が空だとstartNextDownload()
を追加する前に、urlを追加します。 (注意してください。startNextDownload()
はプログラムを終了させます。downloadQueue
が空である場合) -
理由がよくわからない。
QTimer::signleShot(x, y, z)
が全く使用されていません。私の理解では、0ミリ秒の遅延でスロットを作動させるタイマーです。 - Qt Assistant を見ても、singleShot が、与えられたミリ秒間隔で繰り返しスロットを起動するための1回限りの設定なのか、それとも1回限りの設定なのかが分かりませんでした。
明確にしてください。
初心者で、こんな例では。
statement1;
statement2;
よく見かける
statement1
の作業に移る前に実行し、終了しています。
statement2
. しかし、Qtを学ぼうとして、与えられた例を読むと、私は
SLOT(startNextDownload())
の後に活性化されます。
downloadQueue.enqueue(url);
が行われました。私が理解しようとしているのは
なぜ
はこのように動作します。
解決方法は?
現在の質問のタイトルに対する回答
を呼び出すたびに
QTimer::singleShot(...)
が実行されるのは
イベントループが呼び出されたスレッドの
**. メインスレッドから起動された場合、イベントループは
app.exec()
.
Qt-Network-Manager-Exampleによると、この関数は、以下のように呼ばれています。 後 そのため、シングルショットはキューが完全に満たされた後に処理されます。qt のドキュメントではこのトピックについてまだそれほど明確になっていないので、イベント処理などの詳細については以下を参照してください。 こちら .
旧質問のタイトルに対する回答
先に言っておくと、タイマーはダウンロードを別スレッドで行うためのものです。そのため、GUIはレスポンスよく動作します。
完全な
downloadNext()
メソッドは再帰的です。これは一度だけ呼ばれ、キューが空になるまで呼び出されます。
これを見てください。
void DownloadManager::append(const QStringList &urlList)
{
foreach (QString url, urlList)
append(QUrl::fromEncoded(url.toLocal8Bit())); //Call for only one URL
...
}
void DownloadManager::append(const QUrl &url)
{
if (downloadQueue.isEmpty())
//I'm only called if the queue is empty! And I will be called after the next line. Not instantly!
QTimer::singleShot(0, this, SLOT(startNextDownload()));
downloadQueue.enqueue(url);
++totalCount;
}
キューが空になった後、各メソッドは戻り、少なくともダウンロードが完了した旨のメッセージが出力されます。
では、なぜこれがうまくいくのでしょうか? 下記の第1章をご覧ください。
関連
-
[解決済み] テスト
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] ルール・オブ・スリーとは?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] ムーブセマンティクスとは何ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】Enterキーを押して続行する
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む