這兩個函數都是無限循環,如何創建一個新線程來使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