Russian Qt Forum

Qt => Вопросы новичков => Тема начата: alek от Декабрь 17, 2013, 12:56



Название: Событие Win32
Отправлено: alek от Декабрь 17, 2013, 12:56
Доброго времени суток!

Есть плата от которой приходит прерывание через событие Win32 API. В VS код на С++:
Код:
HANDLE hBcEvent;
hBcEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
tmkdefevent(hBcEvent, TRUE);
bcputw(0, CW(RT_ADDR, RT_RECEIVE, wSubAddr, wLen)); //Запись командного слова в базу
bcputblk(1, awBuf, wLen); //Запись передаваемых данных
bcstartx(wBase, DATA_BC_RT); //Передача данных
/* Wait for an interrupt */
  switch (WaitForSingleObject(hBcEvent, 1000))
  {
  case WAIT_OBJECT_0:
    ResetEvent(hBcEvent);
    break;
  case WAIT_TIMEOUT:
    printf("Interrupt timeout error\n"); // qDebug() << "Interrupt timeout error" << endl;
    break;
  default:
    printf("Interrupt wait error\n"); // qDebug() << "Interrupt wait error" << endl;
    break;
  }
нормально работает.
Но на Qt такой код срабатывает только 1 раз. Дольше выдает "Interrupt timeout error". Подскажите пожалуйста в чем может быть проблема?
Вырезка из документации на плату:
Цитировать
В драйверах Windows работа с прерываниями осуществляется через механизм событий Win32. Прежде всего, процесс должен сообщить драйверу идентификатор (handle) используемого события для текущего выбранного ТМК через вызов функции tmkdefevent, которой передается в качестве первого параметра идентификатор события Win32, полученный из Win32 вызова CreateEvent:

void tmkdefevent(HANDLE hEvent, BOOL fEventSet);

Нулевое значение hEvent отменяет использование события. Значение параметра fEventSet равное TRUE указывает на необходимость установки события драйвером через вызовы SetEvent, а значение FALSE - через вызовы PulseEvent. Внимание! В текущей версии драйвера значение переменной fEventSet игнорируется (принимается равным TRUE).


Название: Re: Событие Win32
Отправлено: kuzulis от Декабрь 17, 2013, 14:53
Qt здесь ни при чем, скорее всего tmkdefevent(hBcEvent, TRUE) нужно перевызывать каждый раз после срабатывания события (или таймаута или ошибки).

Можешь еще так попробовать:

Код
C++ (Qt)
 
class MtkEventProcessor
{
   Q_OBJECT
 
public:
   explicit MtkEventProcessor(QObject *parent = 0)
       : m_bcNotifier(new QWinEventNotifier(this))
   {
       connect(m_bcNotifier, SIGNAL(activated(HANDLE)), this, SLOT(handleEvent(HANDLE)));
 
       m_hBcEvent = CreateEvent(NULL, FALSE, FALSE, NULL); // auto reset event type
       m_bcNotifier->setHandle(m_hBcEvent);
 
       tmkdefevent(m_hBcEvent, TRUE);
   }
 
   ~MtkEventProcessor()
   {
       m_bcNotifier->stop();
       CloseHandle(m_hBcEvent);        
   }
 
   void start()
   {
       m_bcNotifier->start();
   }
 
private slots:
   void handleEvent(HANDLE hEvent)
   {
       if (hEvent == m_hBcEvent) {
           // do something
       } else {
           // do something
       }
 
       tmkdefevent(hBcEvent, TRUE);
   }
 
private:
   HANDLE m_hBcEvent;
   QWinEventNotifier *m_bcNotifier;
}
 
int main()
{
   QCoreApplication app;
 
   MtkEventProcessor processor;
   processor.start();
 
   return app.exec();
}
 
 


Название: Re: Событие Win32
Отправлено: alek от Декабрь 18, 2013, 08:40
Не знаю, может у меня руки кривые, но работать все равно не стало.


Название: Re: Событие Win32
Отправлено: alek от Декабрь 18, 2013, 13:21
В общем получилось, написал функцию инициализации устройства не там :)