Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Alex_C от Июль 18, 2012, 14:09



Название: WaitForSingleObject и QWaitCondition::wait - это одно и тоже?
Отправлено: Alex_C от Июль 18, 2012, 14:09
Мне нужно затормозить поток пока мютекс не раздлочится или пока таймаут не пройдет.
Для этого нужно QWaitCondition::wait использовать? Чего то он у меня все время по таймауту срабатывает.

И чтоб не плодить другие темы:
- слот в QThred при вызове работает в основном потоке или в потоке треда?
- есть 2 QLineEdit, которые взаимно по сигналу textChanged() реагируют на изменения. Как избежать зацикливания? Где-то я это встречал, а сейчас не найду.


Название: Re: WaitForSingleObject и QWaitCondition::wait - это одно и тоже?
Отправлено: CJ1 от Июль 18, 2012, 14:12
QCoreApplication::processEvents()

Не подойдет?


Название: Re: WaitForSingleObject и QWaitCondition::wait - это одно и тоже?
Отправлено: mutineer от Июль 18, 2012, 14:16
- слот в QThred при вызове работает в основном потоке или в потоке треда?
Зависит от того, в каком потоке живет сам объект QThread, как вызывают слот, и если через сигнал, то какой тип соединения


Название: Re: WaitForSingleObject и QWaitCondition::wait - это одно и тоже?
Отправлено: Bepec от Июль 18, 2012, 14:20
Тормозит поток и обычный мьютекс.
А QWaitCondition ждёт, пока не будет снят мутекс.


Сигнал слотовое соединение зависит от объектов и типа соединения.

Зацикливания можно избежать стражами - булевскими флагами аля "я сейчас изменяюсь, ты не рыпайся пока" :)


Название: Re: WaitForSingleObject и QWaitCondition::wait - это одно и тоже?
Отправлено: Alex_C от Июль 18, 2012, 14:49
Тогда более подробно о ситуации:
есть устройства, работающие по ком-порту. Необходимо с них считывать информацию, не тормозя основной поток.
Создал наследника от QThread. В нем объект QtSerialPort.

Код
C++ (Qt)
connect(m_port, SIGNAL(readyRead()), this, SLOT(slot_readDataFromPort()));
 

Слот slot_readDataFromPort() в каком треде будет выполняться?

На счет мютекса: посылаю комманду в ком-порт и ожидаю прихода данных от устройства

Код
C++ (Qt)
   QMutex m_waitEndCommand;
   QWaitCondition m_isEndCommand;
 
void CommandThread::run()
{
   isWork = true;
 
   // Основной цикл посылки комманд на COM-порт
   while(isWork)
   {
       if(!m_waitEndCommand.tryLock())
           return;
 
       m_port->write(m_rigCommands.status.at(i).commandArray);
       m_isEndCommand.wait(&m_waitEndCommand, m_timeOut); // Вот тут у меня все время срабатывает  по таймауту
       m_waitEndCommand.unlock();
   }
 
   // Перед окончанием - закрываем COM-порт
   m_port->close();
}
 
 

слот в треде, который получает данные

Код
C++ (Qt)
void CommandThread::slot_readDataFromPort()
{
   m_byteArea += m_port->readAll();
   .... тут я полученные данные обрабатываю
   m_waitEndCommand.unlock();
}
 



Название: Re: WaitForSingleObject и QWaitCondition::wait - это одно и тоже?
Отправлено: mutineer от Июль 18, 2012, 14:53
Тогда более подробно о ситуации:
есть устройства, работающие по ком-порту. Необходимо с них считывать информацию, не тормозя основной поток.
Создал наследника от QThread. В нем объект QtSerialPort.

Код
C++ (Qt)
connect(m_port, SIGNAL(readyRead()), this, SLOT(slot_readDataFromPort()));
 

Слот slot_readDataFromPort() в каком треде будет выполняться?

В том же, в котором живет this


Название: Re: WaitForSingleObject и QWaitCondition::wait - это одно и тоже?
Отправлено: Akon от Июль 18, 2012, 15:02
Цитировать
- есть 2 QLineEdit, которые взаимно по сигналу textChanged() реагируют на изменения. Как избежать зацикливания? Где-то я это встречал, а сейчас не найду.
Код:
void Foo::setValue(int value)
{
  if (value_ == value) return;  // вот это предотвращает зацикливание
  value_ = value;
  Q_EMIT valueChanged(value);
}


Название: Re: WaitForSingleObject и QWaitCondition::wait - это одно и тоже?
Отправлено: Igors от Июль 18, 2012, 15:42
И чтоб не плодить другие темы:
Плодить конечно не надо, но все-таки вопросы хоть как-то должны быть связаны между собой. А так хз на какой отвечать  :)

Код
C++ (Qt)
       m_isEndCommand.wait(&m_waitEndCommand, m_timeOut); // Вот тут у меня все время срабатывает  по таймауту
 
Ну а почему он не должен срабатывать если время истекло?

Код
C++ (Qt)
void CommandThread::slot_readDataFromPort()
{
   m_byteArea += m_port->readAll();
   .... тут я полученные данные обрабатываю
   m_waitEndCommand.unlock();
}
 
Так надо по букварю - взять мутекс, вызвать wakeOne (wakeAll) и освободить мутекс - а  у Вас?


Название: Re: WaitForSingleObject и QWaitCondition::wait - это одно и тоже?
Отправлено: Alex_C от Июль 20, 2012, 13:57
Тут дело не в букваре, а в вопросе в заголовке темы :)
Разобрался - QWaitCondition нужен совсем для другого, чем я его пытался использовать.
Ответ на заголовок темы:
WaitForSingleObject и QWaitCondition::wait - это не одно и тоже.


Название: Re: WaitForSingleObject и QWaitCondition::wait - это одно и тоже?
Отправлено: Igors от Июль 20, 2012, 14:24
Тут дело не в букваре, а в вопросе в заголовке темы :)
Разобрался - QWaitCondition нужен совсем для другого, чем я его пытался использовать.
Ответ на заголовок темы:
WaitForSingleObject и QWaitCondition::wait - это не одно и тоже.
Понял, в след раз буду отвечать только "да" или "нет"  :)


Название: Re: WaitForSingleObject и QWaitCondition::wait - это одно и тоже?
Отправлено: Alex_C от Июль 21, 2012, 11:46
Ну собственно в большинстве случаев так и надо отвечать :)
Если человек умный - должен сам разобраться. Нужно только дать верное направление - а дальше сам, только сам :)