Russian Qt Forum
Ноябрь 24, 2024, 04:42
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Как приостановить выполнение процедуры до получения сигнала (QT)
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Как приостановить выполнение процедуры до получения сигнала (QT) (Прочитано 9778 раз)
iBaaX
Гость
Как приостановить выполнение процедуры до получения сигнала (QT)
«
:
Ноябрь 09, 2014, 21:45 »
Знатоки подскажите как можно, грубо говоря, поставить процедуру на паузу, а потом с этой паузы снять при получении сигнала, причем все это (и процедура и сигналы) происходят в внутри одного потоке QThread.
Записан
Fat-Zer
Гость
Re: Как приостановить выполнение процедуры до получения сигнала (QT)
«
Ответ #1 :
Ноябрь 09, 2014, 22:31 »
Код:
QEventLoop loop;
connect(yourObject, SIGNAL(yourSignal()), &loop, SLOT(quit()));
loop.exec();
только не злоупотребляй этим...
Записан
iBaaX
Гость
Re: Как приостановить выполнение процедуры до получения сигнала (QT)
«
Ответ #2 :
Ноябрь 09, 2014, 22:33 »
не работает для меня это.
останов происходит внутри do while и конструкция qeventloop срабатывает один раз, а на второй зависает.
Записан
Bepec
Гость
Re: Как приостановить выполнение процедуры до получения сигнала (QT)
«
Ответ #3 :
Ноябрь 09, 2014, 23:52 »
Стража поставь.
bool guard.
В слоте меняешь его на true/false. А в цикле блок обработки его. Вот и всё.
Записан
iBaaX
Гость
Re: Как приостановить выполнение процедуры до получения сигнала (QT)
«
Ответ #4 :
Ноябрь 10, 2014, 00:01 »
И зачем мне никчемно загружать процессор?? Индусский код писать это не мое.
Записан
kibsoft
Хакер
Offline
Сообщений: 625
Re: Как приостановить выполнение процедуры до получения сигнала (QT)
«
Ответ #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
Гость
Re: Как приостановить выполнение процедуры до получения сигнала (QT)
«
Ответ #6 :
Ноябрь 10, 2014, 01:20 »
Цитата: kibsoft от Ноябрь 10, 2014, 00:47
Цитировать
Индусский код писать это не мое.
Значит пересмотрите архитектуру вашего проекта, в одном потоке вряд ли получится такое сделать.
Зачем флудить?? Если есть что по существу пиши, а нет проходи мимо.
Записан
Bepec
Гость
Re: Как приостановить выполнение процедуры до получения сигнала (QT)
«
Ответ #7 :
Ноябрь 10, 2014, 01:46 »
Это не индусский код
Это стандартный подход в вашем случае.
Процессор будет загружен настолько, насколько его загрузит блок кода, который вы напишите
И ни одной инструкцией больше. Это уже вопрос к вашим рукам и знаниям
К примеру оффлайн игры используют общий таймер, который при паузе просто останавливается и следующего тика не происходит.
PS и kibsoft дело говорит. Если уж стража вы обзываете индусским кодом, то архитектуру желательно пересмотреть
PPS если после прочтения вышеизложенного не дойдёт, то поясню на пальцах.
Страж будет меняться с true на false. В
блоке условия
, который вы должны написать сами, вы можете задать паузу eventLoop'ом. В этом случае ваш код будет бодрым, весёлым и не загружающим процессор пустым циклом.
«
Последнее редактирование: Ноябрь 10, 2014, 01:48 от Bepec
»
Записан
iBaaX
Гость
Re: Как приостановить выполнение процедуры до получения сигнала (QT)
«
Ответ #8 :
Ноябрь 10, 2014, 02:12 »
Вы видно не внимательно читали
1. QEventLoop не отрабатывает более одного раза в одном цикле
2. В пустом цикле с ожиданием сигнала на гуард мы загрузим процессор на 100% и тем самым вообще заблокируем все процедуры потока
3. Всякие sleep и таймеры тоже не подходят так как нужен выход из режима ожидания не по времени а по сигналу.
4. Я нахожусь в процессе разработки и если не найдется простого решения для ожидания, то соответственно поменяю структуру.
Записан
Bepec
Гость
Re: Как приостановить выполнение процедуры до получения сигнала (QT)
«
Ответ #9 :
Ноябрь 10, 2014, 02:20 »
Не дошло...
Печаль тоска помидоры.
1) Отрабатывает. Скорее всего у вас там написано как то заковыристо.
2) Поэтому я написал, цитирую
Цитировать
А в цикле блок обработки его
Ситуацию пустого цикла разрулите вы, написав этот блок обработки. Это же естественно.
3) Слип вешает поток, таймер по архитектуре не подходит, евент луп подходит превосходно. Он для того и сделан.
4) Хорошо.
PS Если вы желаете чтобы помог я разобраться с eventloop'ом и данной ситуацией, сделайте тестовый проект с проблемой и прикрепите к сообщению. И мы вместе с вами разберёмся, найдём ошибку и/или найдём способ решения.
«
Последнее редактирование: Ноябрь 10, 2014, 02:51 от Bepec
»
Записан
vulko
Гость
Re: Как приостановить выполнение процедуры до получения сигнала (QT)
«
Ответ #10 :
Ноябрь 10, 2014, 08:38 »
Предлагаю сделать отдельный поток, который будет слать сигнал.
Ну и currentThread.join()
«
Последнее редактирование: Ноябрь 10, 2014, 10:58 от vulko
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Как приостановить выполнение процедуры до получения сигнала (QT)
«
Ответ #11 :
Ноябрь 10, 2014, 09:20 »
Цитата: iBaaX от Ноябрь 10, 2014, 02:12
2. В пустом цикле с ожиданием сигнала на гуард мы загрузим процессор на 100% и тем самым вообще заблокируем все процедуры потока
Тут вообще не понял. Если цикл с ожиданием - как же испустим сигнал? (ведь все в 1 нитке)
Цитата: iBaaX от Ноябрь 10, 2014, 02:12
1. QEventLoop не отрабатывает более одного раза в одном цикле
Должно работать, но обрабатываться будут все сигналы/события, не только нужный. Что чревато. напр какое-то событие опять вызывает "ожидающую" процедуру или убивает данные что она использует. Поэтому применимость ограничена, хорошо если можно защититься модальным окном.
Не существует полноценной замены нормальному решению в событийной схеме: разбить ф-цию на 2, до и после сигнала.
Записан
Bepec
Гость
Re: Как приостановить выполнение процедуры до получения сигнала (QT)
«
Ответ #12 :
Ноябрь 10, 2014, 10:37 »
EventLoop тормозит процедуру, но при этом очередь событий продолжает выполняться. Т.е. сигнал пройдет и переменная поменяется.
А eventLoop'ом мы и разбиваем
Записан
kibsoft
Хакер
Offline
Сообщений: 625
Re: Как приостановить выполнение процедуры до получения сигнала (QT)
«
Ответ #13 :
Ноябрь 10, 2014, 12:25 »
Цитата: iBaaX от Ноябрь 10, 2014, 01:20
Зачем флудить?? Если есть что по существу пиши, а нет проходи мимо.
Это не флуд, а намек на то, чтобы вынести ваш 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
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...