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

0

У меня есть следующий код для объединения данных событий (на основе этого протокола 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, но я могу читать только сегменты данных в то время, которое бесполезно для приложения с несколькими касаниями.

  • 0
    Вы должны попытаться опросить с помощью syscall poll (2) !!
  • 0
    И вы должны проверить результат чтения (2) ...
Показать ещё 2 комментария
Теги:
multithreading
linux-device-driver

1 ответ

0
Лучший ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню