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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как приостановить выполнение процедуры до получения сигнала (QT)  (Прочитано 9782 раз)
iBaaX
Гость
« : Ноябрь 09, 2014, 21:45 »

Знатоки подскажите как можно, грубо говоря, поставить процедуру на паузу, а потом с этой паузы снять при получении сигнала, причем все это (и процедура и сигналы) происходят в внутри одного потоке QThread.
Записан
Fat-Zer
Гость
« Ответ #1 : Ноябрь 09, 2014, 22:31 »

Код:
QEventLoop loop;
connect(yourObject, SIGNAL(yourSignal()), &loop, SLOT(quit()));
loop.exec();
только не злоупотребляй этим...
Записан
iBaaX
Гость
« Ответ #2 : Ноябрь 09, 2014, 22:33 »

не работает для меня это.
останов происходит внутри do while и конструкция qeventloop срабатывает один раз, а на второй зависает.
Записан
Bepec
Гость
« Ответ #3 : Ноябрь 09, 2014, 23:52 »

Стража поставь.
bool guard.

В слоте меняешь его на true/false. А в цикле блок обработки его. Вот и всё.
Записан
iBaaX
Гость
« Ответ #4 : Ноябрь 10, 2014, 00:01 »

И зачем мне никчемно загружать процессор?? Индусский код писать это не мое.
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #5 : Ноябрь 10, 2014, 00:47 »

Цитировать
Индусский код писать это не мое.
Значит пересмотрите архитектуру вашего проекта, в одном потоке вряд ли получится такое сделать.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
iBaaX
Гость
« Ответ #6 : Ноябрь 10, 2014, 01:20 »

Цитировать
Индусский код писать это не мое.
Значит пересмотрите архитектуру вашего проекта, в одном потоке вряд ли получится такое сделать.

Зачем флудить?? Если есть что по существу пиши, а нет проходи мимо.
Записан
Bepec
Гость
« Ответ #7 : Ноябрь 10, 2014, 01:46 »

Это не индусский код Улыбающийся Это стандартный подход в вашем случае.

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

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

PS и kibsoft дело говорит. Если уж стража вы обзываете индусским кодом, то архитектуру желательно пересмотреть Улыбающийся

PPS если после прочтения вышеизложенного не дойдёт, то поясню на пальцах.
Страж будет меняться с true на false. В блоке условия, который вы должны написать сами, вы можете задать паузу eventLoop'ом. В этом случае ваш код будет бодрым, весёлым и не загружающим процессор пустым циклом.
« Последнее редактирование: Ноябрь 10, 2014, 01:48 от Bepec » Записан
iBaaX
Гость
« Ответ #8 : Ноябрь 10, 2014, 02:12 »

Вы видно не внимательно читали
1. QEventLoop не отрабатывает более одного раза в одном цикле
2. В пустом цикле с ожиданием сигнала на гуард мы загрузим процессор на 100% и тем самым вообще заблокируем все процедуры потока
3. Всякие sleep и таймеры тоже не подходят так как нужен выход из режима ожидания не по времени а по сигналу.
4. Я нахожусь в процессе разработки и если не найдется простого решения для ожидания, то соответственно поменяю структуру.
Записан
Bepec
Гость
« Ответ #9 : Ноябрь 10, 2014, 02:20 »

Не дошло...

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

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

PS Если вы желаете чтобы помог я разобраться с eventloop'ом и данной ситуацией, сделайте тестовый проект с проблемой и прикрепите к сообщению. И мы вместе с вами разберёмся, найдём ошибку и/или найдём способ решения.  
« Последнее редактирование: Ноябрь 10, 2014, 02:51 от Bepec » Записан
vulko
Гость
« Ответ #10 : Ноябрь 10, 2014, 08:38 »

Предлагаю сделать отдельный поток, который будет слать сигнал.
Ну и currentThread.join() Подмигивающий
« Последнее редактирование: Ноябрь 10, 2014, 10:58 от vulko » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Ноябрь 10, 2014, 09:20 »

2. В пустом цикле с ожиданием сигнала на гуард мы загрузим процессор на 100% и тем самым вообще заблокируем все процедуры потока
Тут вообще не понял. Если цикл с ожиданием - как же испустим сигнал? (ведь все в 1 нитке)

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

Не существует полноценной замены нормальному решению в событийной схеме: разбить ф-цию на 2, до и после сигнала.
Записан
Bepec
Гость
« Ответ #12 : Ноябрь 10, 2014, 10:37 »

EventLoop тормозит процедуру, но при этом очередь событий продолжает выполняться. Т.е. сигнал пройдет и переменная поменяется.

А eventLoop'ом мы и разбиваем Улыбающийся
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #13 : Ноябрь 10, 2014, 12:25 »

Зачем флудить?? Если есть что по существу пиши, а нет проходи мимо.
Это не флуд, а намек на то, чтобы вынести ваш do/while в отдельный поток, а там можно попробовать мьютексом лок делать.
У вас есть какие-то весомые причины использования do/while с остальными операциями в одном потоке?
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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