这两个函数都是无限循环,
并且程序在同一线程中调用一次就会挂起。
gtk_main();
...
pcap_loop(adhandle, 0, packet_handler, NULL);
当我点击“开始”按钮时,我想pcap
开始工作;如果我按下“停止”按钮,就pcap
停止。
如何创建子线程并pcap_loop(adhandle, 0, packet_handler, NULL);
改为运行?
这两个函数都是无限循环,
并且程序在同一线程中调用一次就会挂起。
gtk_main();
...
pcap_loop(adhandle, 0, packet_handler, NULL);
当我点击“开始”按钮时,我想pcap
开始工作;如果我按下“停止”按钮,就pcap
停止。
如何创建子线程并pcap_loop(adhandle, 0, packet_handler, NULL);
改为运行?
除非我遗漏了什么,否则您的问题是 GTK+ 和 libpcap 都是围绕从主循环触发的事件组织的。不看文档,我不知道 GTK+,但是 libpcap 还有另一种操作模式:您可以使用pcap_next()
或
pcap_next_ex()
不放弃对程序流的控制。
g_timeout_add()
应该可以使用or注册一个定期调用这两个函数之一的函数g_idle_add()
,从而完全消除了使用线程和互斥机制的麻烦。
查看g_thread_create()
. 另请阅读本教程和这篇博文,了解有关多线程 GTK 程序的更多信息。
gtk_main()
基本上,当您构建用户界面并启动程序时,您首先要调用。然后在“开始”按钮的回调中,创建一个新线程g_thread_create()
,您可以在其中调用pcap_loop()
.
“停止”按钮有点困难,因为 GLib 不允许您从不同线程中断线程。您必须创建一些信号机制;例如,由 a 保护的布尔中止标志GMutex
。在您的停止按钮回调中,使用 锁定标志g_mutex_lock()
、设置它并使用 解锁g_mutex_unlock()
。在您的packet_handler
中,还要锁定标志、读取它并解锁它。如果设置了标志,则调用您调用的任何内容以使 pcap 跳出循环。