Russian Qt Forum
Ноябрь 25, 2024, 02:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: WaitForSingleObject и QWaitCondition::wait - это одно и тоже?  (Прочитано 5744 раз)
Alex_C
Гость
« : Июль 18, 2012, 14:09 »

Мне нужно затормозить поток пока мютекс не раздлочится или пока таймаут не пройдет.
Для этого нужно QWaitCondition::wait использовать? Чего то он у меня все время по таймауту срабатывает.

И чтоб не плодить другие темы:
- слот в QThred при вызове работает в основном потоке или в потоке треда?
- есть 2 QLineEdit, которые взаимно по сигналу textChanged() реагируют на изменения. Как избежать зацикливания? Где-то я это встречал, а сейчас не найду.
Записан
CJ1
Гость
« Ответ #1 : Июль 18, 2012, 14:12 »

QCoreApplication::processEvents()

Не подойдет?
Записан
mutineer
Гость
« Ответ #2 : Июль 18, 2012, 14:16 »

- слот в QThred при вызове работает в основном потоке или в потоке треда?
Зависит от того, в каком потоке живет сам объект QThread, как вызывают слот, и если через сигнал, то какой тип соединения
Записан
Bepec
Гость
« Ответ #3 : Июль 18, 2012, 14:20 »

Тормозит поток и обычный мьютекс.
А QWaitCondition ждёт, пока не будет снят мутекс.


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

Зацикливания можно избежать стражами - булевскими флагами аля "я сейчас изменяюсь, ты не рыпайся пока" Улыбающийся
Записан
Alex_C
Гость
« Ответ #4 : Июль 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();
}
 

Записан
mutineer
Гость
« Ответ #5 : Июль 18, 2012, 14:53 »

Тогда более подробно о ситуации:
есть устройства, работающие по ком-порту. Необходимо с них считывать информацию, не тормозя основной поток.
Создал наследника от QThread. В нем объект QtSerialPort.

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

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

В том же, в котором живет this
Записан
Akon
Гость
« Ответ #6 : Июль 18, 2012, 15:02 »

Цитировать
- есть 2 QLineEdit, которые взаимно по сигналу textChanged() реагируют на изменения. Как избежать зацикливания? Где-то я это встречал, а сейчас не найду.
Код:
void Foo::setValue(int value)
{
  if (value_ == value) return;  // вот это предотвращает зацикливание
  value_ = value;
  Q_EMIT valueChanged(value);
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Июль 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) и освободить мутекс - а  у Вас?
Записан
Alex_C
Гость
« Ответ #8 : Июль 20, 2012, 13:57 »

Тут дело не в букваре, а в вопросе в заголовке темы Улыбающийся
Разобрался - QWaitCondition нужен совсем для другого, чем я его пытался использовать.
Ответ на заголовок темы:
WaitForSingleObject и QWaitCondition::wait - это не одно и тоже.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Июль 20, 2012, 14:24 »

Тут дело не в букваре, а в вопросе в заголовке темы Улыбающийся
Разобрался - QWaitCondition нужен совсем для другого, чем я его пытался использовать.
Ответ на заголовок темы:
WaitForSingleObject и QWaitCondition::wait - это не одно и тоже.
Понял, в след раз буду отвечать только "да" или "нет"  Улыбающийся
Записан
Alex_C
Гость
« Ответ #10 : Июль 21, 2012, 11:46 »

Ну собственно в большинстве случаев так и надо отвечать Улыбающийся
Если человек умный - должен сам разобраться. Нужно только дать верное направление - а дальше сам, только сам Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.223 секунд. Запросов: 23.