здравствуйте! подскажите пожалуйста: в «проблемном» потоке-наследнике qthread выполняется следующий цикл:
while(stop)
{
data=pcap_next(pcap_next(handle,&header);
if(gotpacket()==1){ // gotpacket()- это фильтр для pcap
func1();
...
func8(); // функции обработки принятых данных
}
}
в теле выполнения функций func1,..,func8 происходит обращение к public членам gui-потока и еще одного qthread-потока. когда это происходит вылетает ошибка сегментации.
инициализация библиотеки pcap:
char *dev, errbuf[PCAP_ERRBUF_SIZE];
struct pcap_pkthdr header;
const u_char *Data;
dev = pcap_lookupdev(errbuf);
if (dev == NULL) {
fprintf(stderr, "Couldn't find default device: %s\n", errbuf);
//return(2);
}
printf("Device: %s\n", dev);
handle = pcap_open_live(dev, BUFSIZ, 1, -1, errbuf);
if(handle == NULL){
fprintf(stderr, "Error: %s\n", errbuf);
}
если же я получаю данные без libpcapa, к прмеру считываю сохранненые данные с диска, то подобных ошибок не возникает. такое ощущение, что pcap блокирует поток или процесс.
похожие проблемы возникают если «проблемный» поток заменить на два потока: читатель и писатель. их синхронизирую стандартыными средствами QWaitCondition или QSemaphore, в соответсвии с примерами в документации, и объявляются они в gui-потоке(доступ к ним через указатель). В этом случае возникают глюки: код защищенный средствами синхронизации может выполняться, даже несмотря на то, что соответвующие мьютексы и т.п. уже заняты в другом потоке.