2016-12-13 15 views
-1

私はQtで知っているので、信号の後にスロットに入れることができますが、後でコードを編集するときは、多くの再編が必要となり、事態が複雑になる可能性があります。例えば言うように信号は、Qtの中に放出されるまで プログラムがQtでシグナルを待つ最も簡単な方法は何ですか?

は、あなたのプログラムを保持するために、より簡単な方法があります:また

downloadImage(); 
Qt::waitForSignal(downloadImageFinished()); 
editImage(); 

。なぜこの作品のようなものはありません:

// bool isFinished(); 
downloadImage(); // When done, isFinished() returns true; 
while (!isFinished()) {} 
editImage(); 

?ありがとう。

+5

あなたは間違った質問をしています。私たちの周りの世界は単純ではなく、線形に進化しません。物事は非同期的に起こる。これを反映するようにコードを構造化する必要があります。 質問に表示される疑似同期コードは、暗黙の状態マシンです。ステートフルな動作を明示的にすることで、より明確で柔軟性が増します。 *多くのリストラを必要とし、事を複雑にする可能性があります*あなたが間違っている場合のみ。あなたがしようとしていることのより完全な例を得るためにあなたの質問を編集してください。そうすれば、複雑さの根拠に欠けている前提に対処できます。 –

+1

@KubaOber場合によっては、プログラムを終了する前に、すべてのアクティビティが終了するのを待って、すべてのロックがロック解除されるのを待たなければならないことがあります。私は最初にユーザーが 'X'ウィンドウボタンを押して停止しないで大量のビデオを処理していたときに実行しました - 多くのスレッドが稼働していて、多くのリソースが割り当てられ、mutexがロックされていないときにシャットダウン時に時折クラッシュと警告正しく。 –

+3

ユーザーがウィンドウを閉じたい場合は、そのウィンドウが閉じられるかどうか、そしてコードがユーザーに提供するフィードバックについて完全に制御できます。 Leontyev、あなたは非常に具体的な質問をしているようです。スレッドやその他のものを作成し、ロックを取得し、問題を実証する新しい自己完結型の質問を投稿することができます。 <200行に収まります。それでは、あなたが期待する問題を回避する解決策を提示することができます。そうでなければ、話すのは抽象的すぎる。 –

答えて

3

基本的に、あなたはこれを行う必要があります:サイクル内部

QEventLoop loop; 
    connect(this, &SomeObject::someSignal, &loop, &QEventLoop::quit); 
    // here you can send your own message to signal the start of wait, 
    // start a thread, for example. 
    loop.exec(); //exec will delay execution until the signal has arrived 

待ちはスピンロックの運命にあなたの実行スレッドを置く - これは、任意のプログラムでは発生しないはずです。すべてのコストでスピンロックを避けてください。その結果に対処する必要はありません。すべてがうまくいきますが、この状態では全体的なPCのパフォーマンスを大幅に遅らせるだけで、プロセッサコア全体を自分のために取ることになります。

+1

また、QEventLoop :: exec()を実行する前に信号が通知されていないことを確認してください。非同期操作が起こることがあるほど速く完了することはまれであるが(まれにしかないが)、発見するバグの地獄を作ることができる。 –

関連する問題