Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建新线程以使pcap_loop()和gtk_main()兼容?_C_Gtk_Multithreading_Pcap - Fatal编程技术网

如何创建新线程以使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调用来保护它们。