如何创建新线程以使pcap_loop()和gtk_main()兼容?
这两个函数都是无限循环 在同一个线程中调用一次程序就会挂起如何创建新线程以使pcap_loop()和gtk_main()兼容?,c,gtk,multithreading,pcap,C,Gtk,Multithreading,Pcap,这两个函数都是无限循环 在同一个线程中调用一次程序就会挂起 gtk_main(); ... pcap_loop(adhandle, 0, packet_handler, NULL); 当我点击“开始”按钮时,我想pcap开始工作;如果我按下“停止”按钮,pcap停止 如何创建子线程并运行pcap\u循环(adhandle,0,packet\u处理程序,NULL)取而代之?请查看g\u thread\u create()的文档。另请阅读和,以了解有关多线程GTK程序的更多信息 基本上,在构建用
gtk_main();
...
pcap_loop(adhandle, 0, packet_handler, NULL);
当我点击“开始”按钮时,我想pcap
开始工作;如果我按下“停止”按钮,pcap
停止
如何创建子线程并运行
pcap\u循环(adhandle,0,packet\u处理程序,NULL)代码>取而代之?请查看g\u thread\u create()
的文档。另请阅读和,以了解有关多线程GTK程序的更多信息
基本上,在构建用户界面并启动程序后,您需要首先调用gtk_main()
。然后在“开始”按钮的回调中,使用g\u thread\u create()
创建一个新线程,在其中调用pcap\u loop()
“停止”按钮有点困难,因为GLib不允许您中断来自不同线程的线程。你必须建立一些信号机制;例如,受GMutex
保护的布尔中止标志。在停止按钮回调中,使用g\u mutex\u lock()
锁定标志,设置标志,然后使用g\u mutex\u unlock()
解锁标志。在您的数据包\u处理程序中,也要锁定标志、读取标志并解锁标志。如果设置了该标志,则调用您调用的任何东西以使pcap脱离循环。除非我遗漏了什么,否则您的问题是GTK+和
libpcap围绕从主循环触发的事件进行组织。没有
查看文档,我不知道GTK+,但是
是libpcap的另一种操作模式:您可以使用pcap\u next()
或
pcap\u next\u ex()
而不放弃对程序流的控制
应该可以注册定期调用的函数
这两个函数之一使用g\u timeout\u add()
或g\u idle\u add()
,
不再需要乱搞线程和互斥机制
总之。如何从g\u thread\u create()
创建的线程(子线程)将某些内容输出到gtk\u text\u视图
?请阅读有关gtk中线程的文档。您可以从子线程调用GTK函数,只要您通过使用gdk_threads\u enter()
和gdk_threads\u leave()包围GTK调用来保护它们。