C++ 使用线程时Linux事件轮询不工作

C++ 使用线程时Linux事件轮询不工作,c++,c,linux,multithreading,linux-device-driver,C++,C,Linux,Multithreading,Linux Device Driver,我有以下代码来汇集事件数据(基于此)。为了不延误我的应用程序,我决定使用线程。问题是线程卡在它包含的行中: 读取(_touchEvent,&ie,sizeof(ie)) 我试着在它周围放置printf语句,并在它之前打印它,但不是在它之后 void TouchDriverAdapter::_poolData(){ // Refer to kernel multitouch. struct input_event ie; read(_touchEvent, &ie, size

我有以下代码来汇集事件数据(基于此)。为了不延误我的应用程序,我决定使用线程。问题是线程卡在它包含的行中:
读取(_touchEvent,&ie,sizeof(ie))
我试着在它周围放置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;
}
void TouchDriverAdapter::_poolData(){
//请参阅内核多点触摸。
结构输入\事件ie;
读取(_touchEvent,&ie,sizeof(ie));
如果(即代码==ABS\u MT\u插槽){
_currentSlot=ie.value;
}else if(即代码==同步报告){
_numContacts=\u currentSlot;
//将缓存的数据传输到vector。
对于(int i=0;i\u touchEvent<0){
返回NULL;
}else if(_running==false){
int result=pthread_create(TouchDriverAdapter::_thread,NULL,
TouchDriverAdapter::_runThread,
(无效*)及(实例);;
如果(结果!=0){
printf(“错误:%i,未能创建线程。\n”,结果);
返回NULL;
}
_运行=真;
pthread_detach(*TouchDriverAdapter::_thread);
//pthread_join(*TouchDriverAdapter::_thread,NULL);
返回TouchDriverAdapter::\u实例;
}else if(_running==true){
返回_实例;
}
}

同样,当我不使用线程,但我一次只能读取数据段,这对于多点触控应用程序来说是无用的。

我使用的是上面提到的POSIX pthread_t,一个没有考虑类的库。另一方面,C++的std::thread使这个事件轮询工作完美无瑕,我只需要添加-std=C++11。

应该尝试使用系统调用轮询!!您应该测试…@BasileStarynkevitch的结果我阅读了有关的文档,但如果我没有弄错的话,这只是为了避免在while循环中浪费计算能力,read已经实现了这样的功能。不,
poll
将告诉您文件描述符是否可读
// 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;
  }
}