0

イベントがあり、対応する関数が呼び出されたとしましょう。この機能は外界と相互作用するため、長い遅延が発生することがあります。関数が待機またはハングすると、UI がフリーズし、これは望ましくありません。一方、関数を多くの部分に分割してシグナルを再発行する必要があると、時間がかかり、コードが大幅に分割される可能性があり、デバッグが難しくなり、読みにくくなり、開発プロセスが遅くなります。イベント ドリブン プログラミングに、1 回の関数呼び出しでプロセスを記述し、待機中に mainThread にその仕事をさせることができる特別な機能はありますか? たとえば、コンパイラはキーワードを認識してリターンを実装し、新しいスロットに接続された信号を自動的に再送信できますか? なぜこれが素晴らしいアイデアだと思うのですか;) Qtで作業しています

4

3 に答える 3

1

「イベント ドリブン プログラミングに、1 回の関数呼び出しでプロセスを記述し、待機中に mainThread にその仕事をさせることができる特別な機能はありますか?」

それはノンブロッキングプロセスです。

しかし、元のクエリは、「GUI をフリーズせずに単一のスロットにブロッキング プロセスを実装するにはどうすればよいですか?」というものでした。

おそらく、いくつかのプロセスがブロックする時が来たと判断したときに、他のプロセスを停止する方法を探しているのでしょうか? 通常、親オブジェクトの 1 つでメソッドを呼び出す方法があります。これは、もちろん、使用している特定のオブジェクト (フレームなど) によって異なります。

親オブジェクトを見て、使用したいメソッドがあるかどうかを確認します。正確に望ましい結果を得るには、それらのいずれかをオーバーレイする必要がある場合があります。

于 2010-01-20T23:43:06.100 に答える
1

あなたの2つのオプションは、スレッド化するか、何らかの方法で関数を分割することです.

スレッドを使用すると、理想的なソリューションはQt::Concurrent. すべての処理が既に 1 つの関数内にあり、関数がかなり自己完結型 (クラスのメンバー変数を参照しない) である場合、これは簡単に実行できます。そうでない場合、事態はもう少し複雑になる可能性があります。

関数を分割するには、提案したとおりに実行して、さまざまな部分が次々に呼び出されるようにさまざまな関数に分割するか、より比喩的な方法で実行できますが、内部で他の処理を可能にするために呼び出しを分散させることができますあなたの機能。呼び出しprocessEvents()はあなたが望むことをすると信じていますが、長い間その使用法に出くわしていません. もちろん、クラスの他の部分が (他のイベントに応答して) もう一度実行される可能性があることを理解していない限り、他の問題に遭遇する可能性があります。計算中は不確定な状態になります。

于 2010-01-21T15:28:32.737 に答える
0

長時間実行されるタスクを開始して GUI イベントを処理したいが、タスクが終了するまで GUI を待機させたくない場合は、タスクを実行するスレッドまたは新しいプロセスを作成して、並行して実行する必要があります。仕事。

タスクが I/O バウンドで、I/O を処理するための不定期のコールバックで十分な場合は、スレッドまたはプロセスの作成を回避できる場合があります。select()Qt のメイン ループには詳しくありませんが、GTK がorスタイル ループに統合できるイベント ソースの追加をサポートしpoll()、タイムアウト後またはファイル記述子の準備が整ったときにハンドラーを実行できることは知っています。そのようなタスクがある場合は、イベント ハンドラーにそのようなイベント ソースをアプリケーションのメイン ループに追加させることができます。

于 2010-01-20T23:41:58.143 に答える