2010-05-08 190 views

回答

3

除非我錯過了一些東西,否則你的問題是GTK +和libpcap都是圍繞從主循環中觸發的事件組織的。沒有 查看文檔,我不知道GTK +,但 是libpcap的另一種操作模式:您可以使用pcap_next()pcap_next_ex()而不放棄對程序流程的控制。

它應該是可能的寄存器定期調用的使用g_timeout_add()g_idle_add(), 這兩個功能不再需要惹線程和互斥機制 完全圍繞 一個的函數。

1

查看g_thread_create()的文檔。有關多線程GTK程序的更多信息,請參閱this tutorialthis blog post

基本上,當您建立用戶界面並啓動程序時,您首先需要撥打gtk_main()。然後在「開始」按鈕的回調中,創建一個g_thread_create()的新線程,您可以在其中調用pcap_loop()

「停止」按鈕有點難度,因爲GLib不允許您中斷來自其他線程的線程。你必須創建一些信號機制;例如,由GMutex保護的布爾中止標誌。在您的停止按鈕回撥中,用g_mutex_lock()鎖定標誌,設置它並用g_mutex_unlock()解鎖。在您的packet_handler中,還要鎖定標誌,讀取標誌並解鎖。如果該標誌被設置,然後調用任何你打電話讓pcap突破循環。

+0

如何從'g_thread_create()'創建的線程(子線程)向'gtk_text_view'(主線程)輸出內容? – httpinterpret 2010-05-08 10:17:54

+0

閱讀有關GTK中線程的文檔。只要你用'gdk_threads_enter()'和'gdk_threads_leave()'圍繞GTK調用_protect_它們,就可以從子線程調用GTK函數。 – ptomato 2010-05-08 10:22:34

+0

謝謝,讓我仔細閱讀tuto :) – httpinterpret 2010-05-08 10:25:34