3

これらの 2 つの関数はどちらも無限ループです。

プログラムは、同じスレッドで呼び出されるとハングします。

gtk_main(); 
...
pcap_loop(adhandle, 0, packet_handler, NULL);

「開始」ボタンをクリックすると作業pcap開始し、「停止」ボタンを押すとpcap 停止します。

pcap_loop(adhandle, 0, packet_handler, NULL);子スレッドを作成して代わりに実行するにはどうすればよいですか?

4

2 に答える 2

3

私が何かを見逃していない限り、あなたの問題は、GTK+ と libpcap の両方がメインループから発生したイベントを中心に構成されていることです。ドキュメンテーションを見なければ、GTK+ についてはわかりませんが、libpcap には別の操作モードがあります。プログラム フローの制御を放棄せずに使用pcap_next()でき ます。pcap_next_ex()

g_timeout_add()orを使用して、これら 2 つの関数のいずれかを定期的に呼び出す関数を登録できるようにする必要があります。これg_idle_add()により、スレッドとミューテックス メカニズムをいじる必要がなくなります。

于 2010-05-08T11:00:22.520 に答える
1

のドキュメントを参照してくださいg_thread_create()。マルチスレッド GTK プログラムの詳細については、このチュートリアルこのブログ投稿もお読みください。

基本的にgtk_main()、ユーザー インターフェイスを作成してプログラムを開始したら、最初に呼び出します。次に、「開始」ボタンのコールバックで、g_thread_create()を呼び出す新しいスレッドを作成しますpcap_loop()

GLib では別のスレッドからスレッドに割り込むことができないため、「停止」ボタンは少し難しくなります。何らかのシグナリング メカニズムを作成する必要があります。たとえば、 によって保護されたブール型の中止フラグGMutex。停止ボタンのコールバックで、 でフラグをロックしg_mutex_lock()、設定して、 でロックを解除しg_mutex_unlock()ます。で、packet_handlerフラグをロックし、読み取り、ロックを解除します。フラグが設定されている場合は、pcap をループから抜け出させるために呼び出すものは何でも呼び出します。

于 2010-05-08T10:07:13.613 に答える