はglibの信号の非同期?
-
23-09-2019 - |
質問
使用時のファイルへの派遣を通じて信号 emit
, すべてのリスナー/ハンドラを呼び戻される または が制御権を手放し、イベントループ各リスナー/ハンドラ?
解決
コールバックは、すべてのメインループに制御を放棄することなく、バックツーバックと呼ばれています。
すべてのハンドラが呼び出されるまで、実は、私の知る限り、g_signal_emit()でもコントロールを返さないので、キックでのメイン・ループのための機会はありません。
だから、この記事のタイトルで質問に答えるために:いいえ、glibの信号が非同期ではありません。
他のヒント
ファイル信号を扱うことができ同期または非同期.オープンソース信号は、常に同期するき出信号が返されるわけではありませんので信号を取り扱う。い信号の非同期的に取り扱うGLib,(を使用していvala簡潔用のvalaコンパイラに変換するコードをC)を定義する必要がある信号源の利用を事前に設定したとして例えばIdleSourceはTimeoutSource(I/Oでは?例えばしていただくことを前提とした機能
void my_func() {
stdout.puts("Hello world! (async)\n");
}
び出すためのものではありませんので非同期(同じスレッド!) から
void caller() {
// Here you want to insert the asynchronous call
// that will be invoked AFTER caller has returned.
// Body of caller follows:
stdout.puts("Hello world!\n");
}
ることができない:
void caller() {
// Code for the asynchronous call:
var ev = new IdleSource();
ev.set_callback(() => {
my_func();
return Source.REMOVE; // Source.REMOVE = false
});
ev.attach(MainContext.default());
// Body of caller follows:
stdout.puts("Hello world!\n");
}
また以下の出力:
Hello world!
Hello world! (async)
のmy_func()関数の実行時に度だけメインループ処テーブルシンボリックリンク(でその他の信号処理)。トリガーで特定の時間間隔を経過した利用のTimeoutSource信号源です。一度だけメインループ処する必、そうでない場合、この作動しなくなります。
ドキュメンテーション
所属していません StackOverflow