У меня есть следующий код для объединения данных событий (на основе этого протокола Multitouch). Чтобы сделать это без задержки для моего приложения, я решил использовать потоки. Проблема заключается в том, что поток застревает в строке, где он содержит:
читать (_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;
}
Heres singleton, который у меня есть, который создает поток.
// 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;
}
}
Снова это работает, когда я не использую threading, но я могу читать только сегменты данных в то время, которое бесполезно для приложения с несколькими касаниями.
Я использовал POSIX pthread_t выше, библиотеку, не написанную с учетом классов. C++ std :: thread, с другой стороны, сделал этот опрос событий безупречным, мне просто нужно добавить -std = C++ 11.