Linux Event Polling не работает при использовании потока

У меня есть следующий код для объединения данных событий (на основе этого Мультитач протокол). Чтобы без промедления сделать это в своем приложении, я решил использовать многопоточность. Проблема в том, что поток застревает в строке, где он содержит:
чтения (_touchEvent, &то есть sizeof (т.е.));

Я попытался поместить операторы printf вокруг него и его печати до него, но не после него.

void TouchDriverAdapter::_poolData(){
// Refer to kernel multitouch.
struct input_event ie;
read(_touchEvent, &ie, sizeof(ie));
if(ie.code == ABS_MT_SLOT){
_currentSlot = ie.value;
}else if(ie.code == SYN_REPORT){
_numContacts = _currentSlot;
// Transfer cached data to vector.
for(int i = 0; i <= _numContacts; i++){
_touchData[i] = _touchDataTemp[i];
}
}else{
if(ie.code == ABS_X){
_touchDataTemp[_currentSlot].x = ie.value;
printf("%i\n", ie.value);
}else if(ie.code == ABS_Y){
_touchDataTemp[_currentSlot].y = ie.value;
}
}

_lastCode = ie.code;
}

Вот тот синглтон, который у меня есть, который создает поток.

// Singleton.
TouchDriverAdapter* TouchDriverAdapter::getInstance(){
if(_instance->_touchEvent < 0){
return NULL;
}else if(_running == false){
int result = pthread_create( TouchDriverAdapter::_thread, NULL,
TouchDriverAdapter::_runThread,
(void*)&_instance);
if(result != 0){
printf("Error: %i, Failed to create a thread.\n", result);
return NULL;
}
_running = true;
pthread_detach( *TouchDriverAdapter::_thread);
//pthread_join( *TouchDriverAdapter::_thread, NULL);
return TouchDriverAdapter::_instance;
}else if(_running == true){
return _instance;
}
}

Опять же, это работает, когда я не использую многопоточность, но я могу читать только сегменты данных за один раз, что является бесполезным для мультисенсорного приложения.

0

Решение

Я использовал POSIX pthread_t выше, библиотеку, написанную не с учетом классов. Std :: thread в C ++, с другой стороны, сделал этот опрос без проблем, мне просто нужно добавить -std = c ++ 11.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]