2010-05-08 193 views

回答

3

除非我错过了一些东西,否则你的问题是GTK +和libpcap都是围绕从主循环中触发的事件组织的。没有 查看文档,我不知道GTK +,但 是libpcap的另一种操作模式:您可以使用pcap_next()pcap_next_ex()而不放弃对程序流程的控制。

它应该是可能的寄存器定期调用的使用g_timeout_add()g_idle_add(), 这两个功能不再需要惹线程和互斥机制 完全围绕 一个的函数。

1

查看g_thread_create()的文档。有关多线程GTK程序的更多信息,请参阅this tutorialthis blog post

基本上,当您建立用户界面并启动程序时,您首先需要拨打gtk_main()。然后在“开始”按钮的回调中,创建一个g_thread_create()的新线程,您可以在其中调用pcap_loop()

“停止”按钮有点难度,因为GLib不允许您中断来自其他线程的线程。你必须创建一些信号机制;例如,由GMutex保护的布尔中止标志。在您的停止按钮回拨中,用g_mutex_lock()锁定标志,设置它并用g_mutex_unlock()解锁。在您的packet_handler中,还要锁定标志,读取标志并解锁。如果该标志被设置,然后调用任何你打电话让pcap突破循环。

+0

如何从'g_thread_create()'创建的线程(子线程)向'gtk_text_view'(主线程)输出内容? – httpinterpret 2010-05-08 10:17:54

+0

阅读有关GTK中线程的文档。只要你用'gdk_threads_enter()'和'gdk_threads_leave()'围绕GTK调用_protect_它们,就可以从子线程调用GTK函数。 – ptomato 2010-05-08 10:22:34

+0

谢谢,让我仔细阅读tuto :) – httpinterpret 2010-05-08 10:25:34