Russian Qt Forum

Qt => Общие вопросы => Тема начата: iBaaX от Ноября 09, 2014, 21:45



Название: Как приостановить выполнение процедуры до получения сигнала (QT)
Отправлено: iBaaX от Ноября 09, 2014, 21:45
Знатоки подскажите как можно, грубо говоря, поставить процедуру на паузу, а потом с этой паузы снять при получении сигнала, причем все это (и процедура и сигналы) происходят в внутри одного потоке QThread.


Название: Re: Как приостановить выполнение процедуры до получения сигнала (QT)
Отправлено: Fat-Zer от Ноября 09, 2014, 22:31
Код:
QEventLoop loop;
connect(yourObject, SIGNAL(yourSignal()), &loop, SLOT(quit()));
loop.exec();
только не злоупотребляй этим...


Название: Re: Как приостановить выполнение процедуры до получения сигнала (QT)
Отправлено: iBaaX от Ноября 09, 2014, 22:33
не работает для меня это.
останов происходит внутри do while и конструкция qeventloop срабатывает один раз, а на второй зависает.


Название: Re: Как приостановить выполнение процедуры до получения сигнала (QT)
Отправлено: Bepec от Ноября 09, 2014, 23:52
Стража поставь.
bool guard.

В слоте меняешь его на true/false. А в цикле блок обработки его. Вот и всё.


Название: Re: Как приостановить выполнение процедуры до получения сигнала (QT)
Отправлено: iBaaX от Ноября 10, 2014, 00:01
И зачем мне никчемно загружать процессор?? Индусский код писать это не мое.


Название: Re: Как приостановить выполнение процедуры до получения сигнала (QT)
Отправлено: kibsoft от Ноября 10, 2014, 00:47
Цитировать
Индусский код писать это не мое.
Значит пересмотрите архитектуру вашего проекта, в одном потоке вряд ли получится такое сделать.


Название: Re: Как приостановить выполнение процедуры до получения сигнала (QT)
Отправлено: iBaaX от Ноября 10, 2014, 01:20
Цитировать
Индусский код писать это не мое.
Значит пересмотрите архитектуру вашего проекта, в одном потоке вряд ли получится такое сделать.

Зачем флудить?? Если есть что по существу пиши, а нет проходи мимо.


Название: Re: Как приостановить выполнение процедуры до получения сигнала (QT)
Отправлено: Bepec от Ноября 10, 2014, 01:46
Это не индусский код :) Это стандартный подход в вашем случае.

Процессор будет загружен настолько, насколько его загрузит блок кода, который вы напишите :) И ни одной инструкцией больше. Это уже вопрос к вашим рукам и знаниям :)

К примеру оффлайн игры используют общий таймер, который при паузе просто останавливается и следующего тика не происходит.

PS и kibsoft дело говорит. Если уж стража вы обзываете индусским кодом, то архитектуру желательно пересмотреть :)

PPS если после прочтения вышеизложенного не дойдёт, то поясню на пальцах.
Страж будет меняться с true на false. В блоке условия, который вы должны написать сами, вы можете задать паузу eventLoop'ом. В этом случае ваш код будет бодрым, весёлым и не загружающим процессор пустым циклом.


Название: Re: Как приостановить выполнение процедуры до получения сигнала (QT)
Отправлено: iBaaX от Ноября 10, 2014, 02:12
Вы видно не внимательно читали
1. QEventLoop не отрабатывает более одного раза в одном цикле
2. В пустом цикле с ожиданием сигнала на гуард мы загрузим процессор на 100% и тем самым вообще заблокируем все процедуры потока
3. Всякие sleep и таймеры тоже не подходят так как нужен выход из режима ожидания не по времени а по сигналу.
4. Я нахожусь в процессе разработки и если не найдется простого решения для ожидания, то соответственно поменяю структуру.


Название: Re: Как приостановить выполнение процедуры до получения сигнала (QT)
Отправлено: Bepec от Ноября 10, 2014, 02:20
Не дошло...

Печаль тоска помидоры.

1) Отрабатывает. Скорее всего у вас там написано как то заковыристо.
2) Поэтому я написал, цитирую
Цитировать
А в цикле блок обработки его
Ситуацию пустого цикла разрулите вы, написав этот блок обработки. Это же естественно.
3) Слип вешает поток, таймер по архитектуре не подходит, евент луп подходит превосходно. Он для того и сделан.
4) Хорошо.

PS Если вы желаете чтобы помог я разобраться с eventloop'ом и данной ситуацией, сделайте тестовый проект с проблемой и прикрепите к сообщению. И мы вместе с вами разберёмся, найдём ошибку и/или найдём способ решения.  


Название: Re: Как приостановить выполнение процедуры до получения сигнала (QT)
Отправлено: vulko от Ноября 10, 2014, 08:38
Предлагаю сделать отдельный поток, который будет слать сигнал.
Ну и currentThread.join() ;)


Название: Re: Как приостановить выполнение процедуры до получения сигнала (QT)
Отправлено: Igors от Ноября 10, 2014, 09:20
2. В пустом цикле с ожиданием сигнала на гуард мы загрузим процессор на 100% и тем самым вообще заблокируем все процедуры потока
Тут вообще не понял. Если цикл с ожиданием - как же испустим сигнал? (ведь все в 1 нитке)

1. QEventLoop не отрабатывает более одного раза в одном цикле
Должно работать, но обрабатываться будут все сигналы/события, не только нужный. Что чревато. напр какое-то событие опять вызывает "ожидающую" процедуру или убивает данные что она использует. Поэтому применимость ограничена, хорошо если можно защититься модальным окном.

Не существует полноценной замены нормальному решению в событийной схеме: разбить ф-цию на 2, до и после сигнала.


Название: Re: Как приостановить выполнение процедуры до получения сигнала (QT)
Отправлено: Bepec от Ноября 10, 2014, 10:37
EventLoop тормозит процедуру, но при этом очередь событий продолжает выполняться. Т.е. сигнал пройдет и переменная поменяется.

А eventLoop'ом мы и разбиваем :)


Название: Re: Как приостановить выполнение процедуры до получения сигнала (QT)
Отправлено: kibsoft от Ноября 10, 2014, 12:25
Зачем флудить?? Если есть что по существу пиши, а нет проходи мимо.
Это не флуд, а намек на то, чтобы вынести ваш do/while в отдельный поток, а там можно попробовать мьютексом лок делать.
У вас есть какие-то весомые причины использования do/while с остальными операциями в одном потоке?