QThread. Как вывести поток из состояния блокировки?



  • Здравствуйте!

    При написании сетевого сниффера с использованием библиотеки libpcap столкнулся с очень неприятной проблемой. В функции run() потока захвата пакетов вызывается функция pcap_loop(), которая блокирует поток до момента захвата пакета, удовлетворяющего заданному фильтру. Если таковых пакетов нет, функция вешает поток на неопределенный срок. Для принудительного выхода из данной функции в библиотеке libpcap есть функция pcap_breakloop(); Вся беда в том, что функция эта была написана для использования в обработчиках UNIX-сигналов. То есть, в поток вызвавший pcap_loop() посылается UNIX-сигнал и в обработчике этого сигнала должна быть вызвана функция pcap_breakloop(). В интернете не смог найти информацию о том, как передать потоку, запущенному с помощью QThread UNIX-сигнал. Разумеется, обрабатывать Qt-сигналы данный поток не может, поскольку он на ходится в блокированном состоянии и не может обрабатывать свою очередь сообщений. В сети нашел пост за 2002 год, в котором человек описывает ту же самую проблему. Он решил ее выносом функций захвата в отдельный процесс QProcess, который можно (в отличие от потока QThread) завершить, когда он находится в состоянии блокировки. Прибегать к такой мере мне очень не хочется.

    Подскажите, каким образом можно корректно вывести поток из такой блокировки?



  • man pthread_kill



  • поток вообще не нужен. используй pcap_dispatch() и в качестве 'cnt' передавай 1. сам же вызов функции pcap_dispatch() интегрируй в Qt event-loop.



  • Всем огромное спасибо за ответ!


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.