powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Qt: Как в потоке дождаться сигнала?
9 сообщений из 9, страница 1 из 1
Qt: Как в потоке дождаться сигнала?
    #39626621
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создал экземпляр QThread для асинхронного выполнения действий из основных потоков. У этого объекта есть два сигнала:

Код: plaintext
1.
2.
void finished()
void started()



started надо дождаться перед запуском основных потоков, а finished- перед выдачей сообщения об окончании обработки.

Конечно, можно каждый из этих сигналов связать со слотами с помощью connect. Но это сильно уродует код (надо весь основной код помещать в один слот, а в другой слот помещать код завершения обработки). Код получается сгруппирован не по функциональности, а по "сигнально- слотовой" необходимости ...

Есть какой- то метод, который "усыпляет" текущий поток до момента появления нужного сигнала?
...
Рейтинг: 0 / 0
Qt: Как в потоке дождаться сигнала?
    #39626767
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Твой подход в корне неверный. Сигналы и слоты -- это событийно-управляемое программирование.
А ты хочешь что-то ждать в главном потоке.
Ты должен соединиться с сигналом и ждать, когда он придёт, тогда в слоте что-то делать.

Это первый слой непонимания.

Второй -- что для фоновых задач нужно создавать поток.
Это тоже неправильно, потоки создавать достаточно дорого,
и так их направо налево создавать негоже.
Тебе нужно использовать пул рабочих потоков , он есть в Qt.

http://doc.qt.io/qt-5/qthreadpool.html

Как его использовать я не знаю, не использовал ни разу.
Почитай.

Альтернатива -- использовать потоки и много задачность из STD.
(я бы именно так и делал)
...
Рейтинг: 0 / 0
Qt: Как в потоке дождаться сигнала?
    #39626809
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivТвой подход в корне неверный. Сигналы и слоты -- это событийно-управляемое программирование.
А ты хочешь что-то ждать в главном потоке.
Ты должен соединиться с сигналом и ждать, когда он придёт, тогда в слоте что-то делать.

Это первый слой непонимания.

Спасибо за участие в беседе!
А какая разница ждать в основном потоке или ждать в слоте? А если в программе будет 10 различных вспомогательных объектов, то на каждый создавать свой слот и как-то ждать когда все они сработают (например, через 10 переменных типа bool, совокупность значений которых анализировать в каждом слоте) ?

MasterZivВторой -- что для фоновых задач нужно создавать поток.
Это тоже неправильно, потоки создавать достаточно дорого,
и так их направо налево создавать негоже.

У меня большая сложная задача, для которой время создания вспомогательного потока займет не более 0.001% времени его работы. Поэтому оверхед будет копеешный.

MasterZivАльтернатива -- использовать потоки и много задачность из STD.
(я бы именно так и делал)

Если окажется, что Qt не позволяет дождаться сигнала без извращения всего кода, то так и сделаю. Эта оптимизация мне нужна на 10 уровней ниже по стеку, и совсем не хочется из-за этого переписывать все 10 уровней вверх по стеку: потом ведь никто не поймет зачем эти извращения прикручены.
...
Рейтинг: 0 / 0
Qt: Как в потоке дождаться сигнала?
    #39626885
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже выход нашелся:
1. Для ожидания запуска вспомогательного потока:
Код: plaintext
1.
while(!thread.isRunning ()) yieldCurrentThread ();


2. Для ожидания завершения вспомогательного потока:
Код: plaintext
1.
thread.wait()
...
Рейтинг: 0 / 0
Qt: Как в потоке дождаться сигнала?
    #39626960
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какая разница ждать в основном потоке или ждать в слоте?

В слоте не надо ждать. Его автоматом вызовут, когда надо будет.
...
Рейтинг: 0 / 0
Qt: Как в потоке дождаться сигнала?
    #39626961
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLПохоже выход нашелся:
1. Для ожидания запуска вспомогательного потока:
Код: plaintext
1.
while(!thread.isRunning ()) yieldCurrentThread ();


2. Для ожидания завершения вспомогательного потока:
Код: plaintext
1.
thread.wait()



Это не выход, это эпик фейл.
Buisy wait называется.
Антипаттерн многозадачного программирования.
...
Рейтинг: 0 / 0
Qt: Как в потоке дождаться сигнала?
    #39627033
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivА какая разница ждать в основном потоке или ждать в слоте?

В слоте не надо ждать. Его автоматом вызовут, когда надо будет.

Хорошо, будем ждать, пока не вызовется слот. Ожидание никуда не уйдет, потому что оно определяется не нами, а фактом поступления внешнего события.

MasterZivЭто не выход, это эпик фейл.
Buisy wait называется.
Антипаттерн многозадачного программирования.

Не согласен: любая библиотека многопоточного программирования имеет явные или неявные примитивы ожидания выполнения потоков. Например, в классическом С++ у потоков есть метод join(), который выполняет эту функцию.
...
Рейтинг: 0 / 0
Qt: Как в потоке дождаться сигнала?
    #39627089
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, будем ждать, пока не вызовется слот. Ожидание никуда не уйдет, потому что оно определяется не нами, а фактом поступления внешнего события.

не путай события и слоты.

ну и важно тут не сам факт ожидания, это в конце концов то, чего ты хочешь, а КАК ждать.
"Нужно уметь ждать."

Не согласен: любая библиотека многопоточного программирования имеет явные или неявные примитивы ожидания выполнения потоков. Например, в классическом С++ у потоков есть метод join(), который выполняет эту функцию.[/quot]

согласен ты или нет дело 10ое, твой вейт будет просто грузить одно ядро на почти 100%.

а как раз Join заснёт и отдаст управление другим протокам.
...
Рейтинг: 0 / 0
Qt: Как в потоке дождаться сигнала?
    #39627172
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К 4 основным потокам приделал 5-ый поток с приоритетом Idle для асинхронной записи на диск (у меня 4-ех ядерный Haswell). В итоге с помощью Vtune Amplifier получил такие цифры (до /после), сек:
Время работы: 387 / 312
Время CPU: 1012 / 1241

Видно, что время работы обработки хорошо упало. Рост времени CPU произошел из- за того, что сон пятого асинхронного потока система также учла, так что на это значение внимание обращать не стоит. Другими словами, раньше коэффициент многопоточности был ~2.6, а стал 3.24.

Я доволен, если учесть, что обработка имеет очень большой ввод / вывод: чтение 40 ГБ (с ssd) и запись 16 ГБ на HDD (7200 оборотов).
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Qt: Как в потоке дождаться сигнала?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]