2

ファイル記述子を GLIB メインループにアタッチする必要があります。私の問題は、実行中にファイル記述子のリストが修正されないことです。

GLIBのドキュメントによると、次のことができます。

  • g_io_channel_unix_newを使用して各 FDのGIOChannelを作成し、g_io_add_watchでコンテキストにアタッチします。
  • g_io_create_watchで作成されたGsourceを使用し、コールバックを設定しますg_source_set_callback

私の質問は、ソースまたはコンテキストを動的に変更することは可能ですか? どうすればそれができますか?GSourceFuncs 機能を見つけましたが、それは私の問題には合いません。

ご協力いただきありがとうございます。

4

5 に答える 5

2

g_io_add_watchを使用して、後でウォッチを動的に削除するために使用できるイベント ソース ID を返しますg_source_remove。FD ごとに 1 つのイベント ソースを使用し、既存のウォッチを変更する代わりに、古いものを削除して適切な新しいものを作成します。

于 2014-05-21T11:34:56.087 に答える
1

私はGLIBをさらに掘り下げ、今:

  • コールバック関数 (prepare、check、dispatch、finalize) を使用してソースを作成します
  • prepare コールバックでは、FD は g_source_remove_unix_fd() を使用して削除され、g_source_add_unix_fd() を使用して現在のソースに追加されます。
  • タイムアウトを設定するために FALSE を返しました (私の例では 1 秒)

私の問題は、FD がないと、準備コールバックが期待どおりに 1 ごとに呼び出されることです。FD が追加されると、prepare コールバックがタイムアウトなしで呼び出されます。投票は直接終了します。

GLIB のソース コードを調べましたが、その理由がわかりません。

よろしくお願いします

于 2014-06-03T11:54:53.483 に答える