Выдает Serial Port Watch, используя потоки с циклом событий и QSocketNotifiers - PullRequest
1 голос
/ 25 июня 2009

Я задал этот вопрос вчера, так как не получал никаких данных, но странно, когда я использовал wait в деструкторе, я начал получать уведомление от QSocketNotifier. В остальном вопрос такой же. Может кто-то что-то предложить? Я создал пример приложения, из которого запускается отдельный поток для чтения и обработки данных из последовательного порта. QSocketNotifier используется для определения, поступили ли данные на последовательные порты или нет. Я запускаю цикл обработки событий, используя оператор exec() в функции запуска потока. Но при запуске приложения только после того, как уведомитель сокета сработал, сигнал для активации последовательного порта никогда не генерируется. И однажды, когда он был сгенерирован, он был сгенерирован очень быстро и не был эквивалентен частоте кадров отправляющего устройства.

Вот краткий пример кода для потока последовательного коммуникатора:

SerialPortWatchOne.cpp

//constructor
klass::klass()
{
//setport configuration
//miscellaneous initialization
QSocketNotifier* notifier = new QSocketNotifier(mPort->GetFileDescriptor, QSocketNotifier::Read,this);
connect(notifier,SIGNAL(activated(int)),this,SLOT(ReadAndProcessData()));
}

void klass::run()
{
exec();  //this starts an event loop where by Qt signal handling is enabled
}

void klass::ReadAndProcessData()
{
      FlushBuf();      
      int bytes_read=mPort->ReadPort(mBuf,1000);
      if(bytes_read>0)
         //Process data
}

~klass::klass()
{
//desctruction code;
wait();  //so that thread cleanly releases all resources before exit
}

Примечание: klass является потоком и членом потока GUI и создается в потоке GUI c'tor. GUI периодически обновляет свои виджеты данными из потока klass.

Кто-нибудь может подсказать, в чем проблема? Кто-то делал это раньше.

1 Ответ

0 голосов
/ 21 июля 2009

Единственное, что приходит на ум, это то, что вы используете QSocketNotifier * socketNotifier без цикла событий, запущенного в потоке socketNotifier->thread(). Если никакой цикл событий не запущен, вы не получите обработку событий. Отсутствие обработки событий означает отсутствие сигналов от QSocketNotifier. Но если вы используете отдельный поток, вы все равно можете использовать блокировку вызовов ввода / вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...