2010-05-08 2 views
3

이 두 함수는 모두 무한 루프이며pcap_loop()와 gtk_main()이 호환되도록 새 스레드를 만드는 방법은 무엇입니까?

이고 프로그램이 동일한 스레드에서 호출되면 중단됩니다.

gtk_main(); 
... 
pcap_loop(adhandle, 0, packet_handler, NULL); 

내가 '시작'버튼을 클릭

, 나는 pcap 시작 작업을 원하는, 그리고 내가 "중지"버튼을 pcap 정지을 누르면.

어떻게 하위 스레드를 만들고 pcap_loop(adhandle, 0, packet_handler, NULL);을 대신 실행합니까?

답변

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

+0

GTK의 쓰레드에 관한 문서를 읽으십시오. 'gdk_threads_enter()'와'gdk_threads_leave()'를 사용하여 GTK 호출을 둘러싸면 자식 스레드에서 GTK 함수를 호출 할 수 있습니다. – ptomato

+0

고마워요, 조심스럽게 tuto을 읽어 보겠습니다 :) – httpinterpret