2010-05-08 3 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(). Также читайте this tutorial и this blog post для получения дополнительной информации о многопоточных программах GTK.

В основном вы хотите позвонить gtk_main() первым, когда вы создали свой пользовательский интерфейс и начали свою программу. Затем в обратном вызове для кнопки «начать» создайте новый поток с g_thread_create(), в котором вы вызываете pcap_loop().

Кнопка «Стоп» немного сложнее, поскольку GLib не позволяет прерывать поток из другого потока. Вам нужно будет создать какой-то механизм сигнализации; например, флаг логического прерывания, защищенный GMutex. В обратном вызове кнопки остановки заблокируйте флаг с помощью g_mutex_lock(), установите его и откройте его с помощью g_mutex_unlock(). В вашем packet_handler также заблокируйте флаг, прочитайте его и откройте. Если флаг установлен, тогда вызовите все, что вы вызываете, чтобы pcap вырвался из цикла.

+0

Как я могу вывести что-то в 'gtk_text_view' (основной поток) из потока (дочерний поток), созданного' g_thread_create() '? – httpinterpret

+0

Прочитайте документацию о потоках в GTK. Вы можете вызывать функции GTK из дочернего потока, если вы _protect_ их, окружая вызовы GTK с помощью 'gdk_threads_enter()' и 'gdk_threads_leave()'. – ptomato

+0

Спасибо, дай мне внимательно прочитать туто :) – httpinterpret