如何创建新线程以使pcap_loop()和gtk_main()兼容?

时间:2010-05-08 07:39:00

标签: c gtk multithreading pcap

这两个函数都是无限循环,

并且程序在同一个帖子中被挂起。

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

当我点击“开始”按钮时,我希望pcap 开始工作;如果我按下“停止”按钮,pcap 停止< /强>

如何创建子线程并改为运行pcap_loop(adhandle, 0, packet_handler, NULL);

2 个答案:

答案 0 :(得分:3)

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

应该可以注册定期调用的函数 使用g_timeout_add()g_idle_add()的这两个函数之一, 无需使用线程和互斥机制 共

答案 1 :(得分:1)

查看g_thread_create()的文档。另请阅读this tutorialthis blog post以获取有关多线程GTK程序的更多信息。

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

“停止”按钮稍微困难一些,因为GLib不允许您从其他线程中断线程。你必须创建一些信令机制;例如,由GMutex保护的布尔中止标志。在您的停止按钮回调中,使用g_mutex_lock()锁定该标记,进行设置,然后使用g_mutex_unlock()将其解锁。在packet_handler中,还要锁定标志,阅读并解锁。如果设置了标志,那么调用你调用的任何东西,使pcap突破循环。