这两个函数都是无限循环,
并且程序在同一个帖子中被挂起。
gtk_main();
...
pcap_loop(adhandle, 0, packet_handler, NULL);
当我点击“开始”按钮时,我希望pcap
开始工作;如果我按下“停止”按钮,pcap
停止< /强>
如何创建子线程并改为运行pcap_loop(adhandle, 0, packet_handler, NULL);
?
答案 0 :(得分:3)
除非我遗漏了什么,否则你的问题就是GTK +和
libpcap是围绕从主循环触发的事件组织的。没有
通过文档查看,我不知道GTK +,但在那里
是libpcap的另一种操作模式:您可以使用pcap_next()
或
pcap_next_ex()
,但不放弃对程序流程的控制。
应该可以注册定期调用的函数
使用g_timeout_add()
或g_idle_add()
的这两个函数之一,
无需使用线程和互斥机制
共
答案 1 :(得分:1)
查看g_thread_create()
的文档。另请阅读this tutorial和this blog post以获取有关多线程GTK程序的更多信息。
基本上,当您构建用户界面并启动程序时,您首先要调用gtk_main()
。然后在“开始”按钮的回调中,创建一个g_thread_create()
的新主题,在其中调用pcap_loop()
。
“停止”按钮稍微困难一些,因为GLib不允许您从其他线程中断线程。你必须创建一些信令机制;例如,由GMutex
保护的布尔中止标志。在您的停止按钮回调中,使用g_mutex_lock()
锁定该标记,进行设置,然后使用g_mutex_unlock()
将其解锁。在packet_handler
中,还要锁定标志,阅读并解锁。如果设置了标志,那么调用你调用的任何东西,使pcap突破循环。