Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 20.05.2020
Сообщений: 2
1

Как ставить поток на паузу?

20.05.2020, 11:18. Просмотров 994. Ответов 6

Как ставить функцию, выполняющуюся в потоке, на паузу по нажатию кнопки?
Писал программу в qt creator, чтобы кнопки можно было делать. Я сделал кнопочку, которая собирает данные с полей для ввода и отправляет их в функцию расчёта, отправляет в другой поток (функция очень большая и долго считающая). Мне нужно, чтобы можно было прерывать выполнение этой функции в любой момент (нажимать на паузу). Я даже не представляю, что должно происходить в коде, при нажатии на кнопку "пауза".
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.05.2020, 11:18
Ответы с готовыми решениями:

Поставить поток на паузу и продолжить его позже
Приветствую. Есть поток, он высчитывает интеграл от а до b; class IntegralThread implements...

Ошибка-Текущий поток должен быть задан как поток однопоточного контейнера STA
Значит модуль в нем классы.Я создаю свое гуи.Так вот при вызове процедуры котрая копирует текст(в...

OpenFileDialog и потоки: Текущий поток должен быть задан как поток однопоточного контейнера (STA)
Со стартового окна запускаю формы вот так: new Thread(() => { ...

Как в С++ Builder из 2х потоков рисовать на форме квадратики(это первый поток рисует) и кружочки (2ой поток))
Помогите пожалуйсмта))))) Как в С++ Builder из 2х потоков рисовать на форме квадратики(это первый...

6
87 / 14 / 6
Регистрация: 21.09.2016
Сообщений: 172
25.05.2020, 02:23 2
Если поток выполняет что-то в цикле, то можно из гуи передать указатель на QMutex и его по нажатию кнопки лочить, ну а когда надо возобновить, то анлочить.
0
82 / 74 / 24
Регистрация: 18.10.2017
Сообщений: 683
25.05.2020, 20:53 3
Я не понял, при чём тут Gui, а Mutex предпочёл бы захватывать в другом потоке, специально для этого
созданном. Т.е. по нажатию кнопки этот поток захватывает или освобождает Mutex, так как-то спокойнее,
хотя это, м.б. и лишнее. Но вроде бы я и сам так делал - т.е. захватывал в основной программе.
0
556 / 369 / 142
Регистрация: 01.10.2015
Сообщений: 1,117
25.05.2020, 23:04 4
Мьютекс - средство, позволяющее воспрепятствовать возникновению состояния "гонок". Не знаю, кто с кем будет "гоняться" при данной постановке задачи: всего два потока, причем основной поток программы, исполняющий GUI, однозначно контролирует вычислительный поток.

RJM, peter_irich, мьютекс здесь зачем? Вот объясните мне, я правда не понимаю.
0
87 / 14 / 6
Регистрация: 21.09.2016
Сообщений: 172
Вчера, 00:36 5
0x90h, Полностью согласен, что мутекс предназначен для предотвращения одновременного доступа к данным с целью их изменения.

Тут можно много чего придумать для данной задачи...

Взять QEventLoop (но придется добавлять еще сигналов и слотов чтобы выйти из него).
Или написать отвратительный цикл while(true) - это вообще отвратительно =)

Все это будет давать один и тот же результат, которого ожидает автор.
0
Эксперт С++
1868 / 1219 / 349
Регистрация: 16.05.2013
Сообщений: 3,214
Записей в блоге: 6
Завершенные тесты: 1
Вчера, 08:15 6
Hero Sanya, используйте условные переменные https://doc.qt.io/qt-5/qwaitcondition.html
0
82 / 74 / 24
Регистрация: 18.10.2017
Сообщений: 683
Вчера, 09:45 7
0x90h, я при 1-м чтении тоже не понял, зачем тут mutex, поэтому и предложил 2-й поток.
Делал ли я сам так, как предложил RJM - кажется, когда-то давно пробовал, но потом от этого отказался,
т.к. понял, что это ошибка. Но, если создавать 2-й поток, то останавливать 1-й надо как-то иначе,
т.к. он уже захватил Mutex и 2-й с этим ничего не сделает. Надо 1-му послать команду на освобождение,
тогда 2-й захватит и 1-й будет ждать, пока 2-й не получит команду на освобождение.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Вчера, 09:45

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Вызывающий поток не может получить доступ к объекту, так как его владельцем является другой поток
Есть форма MainWindo, есть класс AB. В форме единая точка доступа к элементам формы. ...

Текущий поток должен быть задан как поток однопоточного контейнера (STA), чтобы вызовы OLE стали возможны
пишет:Текущий поток должен быть задан как поток однопоточного контейнера (STA), чтобы вызовы OLE...

Текущий поток должен быть задан как поток однопоточного контейнера (STA), чтобы вызовы OLE стали возможны
Суть проблемы: Создаю приложение по sql. При создании формы с датагридом и пр. отдельным потоком...

Текущий поток должен быть задан как поток однопоточного контейнера (STA), чтобы вызовы OLE стали возможны
есть следующая функция, при клике по Open выдает ошибку: Текущий поток должен быть задан как поток...

Ошибка: вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток.
Ошибка в "progressBar1.Value += 50;", вызывающий поток не может получить доступ к данному объекту,...

Обновления Windows: ставить или не ставить?
Нужно ли постоянно устанавливать все обновления Windows? Или от них нет никакой пользы? Начну со...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.