这两个函数都是无限循环,如何创建一个新线程来使pcap_loop()和gtk_main()兼容?
并且该程序在同一个线程中挂起一次。
gtk_main();
...
pcap_loop(adhandle, 0, packet_handler, NULL);
当我点击“开始”按钮,我想pcap
到开始工作;如果我按下“停止”按钮,pcap
停止。
如何创建子线程并运行pcap_loop(adhandle, 0, packet_handler, NULL);
?
这两个函数都是无限循环,如何创建一个新线程来使pcap_loop()和gtk_main()兼容?
并且该程序在同一个线程中挂起一次。
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()
或g_idle_add()
, 这两个功能不再需要惹线程和互斥机制 完全围绕 一个的函数。
查看g_thread_create()
的文档。有关多线程GTK程序的更多信息,请参阅this tutorial和this blog post。
基本上,当您建立用户界面并启动程序时,您首先需要拨打gtk_main()
。然后在“开始”按钮的回调中,创建一个g_thread_create()
的新线程,您可以在其中调用pcap_loop()
。
“停止”按钮有点难度,因为GLib不允许您中断来自其他线程的线程。你必须创建一些信号机制;例如,由GMutex
保护的布尔中止标志。在您的停止按钮回拨中,用g_mutex_lock()
锁定标志,设置它并用g_mutex_unlock()
解锁。在您的packet_handler
中,还要锁定标志,读取标志并解锁。如果该标志被设置,然后调用任何你打电话让pcap突破循环。
如何从'g_thread_create()'创建的线程(子线程)向'gtk_text_view'(主线程)输出内容? – httpinterpret 2010-05-08 10:17:54
阅读有关GTK中线程的文档。只要你用'gdk_threads_enter()'和'gdk_threads_leave()'围绕GTK调用_protect_它们,就可以从子线程调用GTK函数。 – ptomato 2010-05-08 10:22:34
谢谢,让我仔细阅读tuto :) – httpinterpret 2010-05-08 10:25:34