![]() |
|
|
![]()
|
|
| Elfet |
|
||||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Ясно, спасибо!
Можете ещё подсказать кое-что? Не хочу отдельную тему создавать. У меня на форме есть ещё две кнопки: Пауза и Стоп. Каким образом можно приостановить выполнение процесса и заново его запустить? Я сделал так:
И подключил слот Pause() к нужной кнопке на форме. А обратно запустить вычисления опять через run():
Нормально ли так? |
||||
|
|||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
никаким. можно в метод потока вставить бесконечный цикл, и его останавливать/возобновлять. Добавлено через 1 минуту и 5 секунд нет. это уже будет не в потоке. Добавлено через 3 минуты и 8 секунд по приведенному вами коду, мне кажется, что можно использовать QWaitCondition, или тупо мьютекс. сложно что-то более точно сказать, так как детали не понятны. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Мне нужно реализовать итерационный процесс решения задачи, который можно с помощью кнопок на форме остановить, возобновить или прекратить вообще.
|
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Я бы посмотрел в сторону QtConcurrent::map()/mapped(), он сам распараллеливает задачу на доступные ядра. Можно поставить на паузу, можно видеть прогресс. А вместо цикла for() должен быть список с задачами или значениями.
|
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
SABROG, вообще хотелось бы с помощью потоков.
|
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 7 Всего: 162 |
||||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
А это и есть отдельные потоки. |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
классно тема начинается, никаких вопросов! JackYF, переименуй пожалуйста тему: Qt, потоки, запуск/останов. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
andrew_121, =))))
|
|||
|
||||
| maxxant |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 8.9.2009 Репутация: 1 Всего: 1 |
Если пауза - имеется ввиду, приостановить цикл, а потом продолжить с того же места. Тогда наверное как-то так:
ну и конструкция вида:
Это обычно диагноз. Поскольку moveToThread() для самого класса потока делать вообщем-то не хорошо. А в коннектах этого сигнала к другим слотам обычно не указывается тип соединения, иногда указывают, но реже. Поэтому, если вдруг в логах (а может раз в месяц) появиться куча сообщений от каких-то сокетов (для X11) при потери связи с иксами или другие интересные глюки, то можно будет добавить в коннекте к слотам тип соединения Qt::QueuedConnection. (но это так догадки, возможно было где-то другое начало темы, начал читать со слов: "ясно, спасибо!"). А ещё лучше сразу сделать дополнительный класс, отдельный от класса потока. |
||||
|
|||||
| Elfet |
|
||||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Так лучше чем заново вызвать метод run()? А что в ней такого?
Что за дополнительный класс? Мне нужно создать отдельный поток с итерационным решением и возможностью его приостановить/возобновить или вообще остановить. |
||||
|
|||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
И ещё я в документации про Qconcurrent прочитал следующее:
|
|||
|
||||
| SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Дык речь о методе run(), который не умеет практически ничего. Не умеет отправлять сигналы о состоянии прогресса, не может быть прерван, не умеет распараллеливать задачи. Я же рекомендовал использовать методы map() или mapped(), которые всё умеют. |
||||
|
|||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Всё же мне не хочется использовать этот QtConcurren.
Какие могут быть проблемы если я буду делать с QThread и событиями для остановки? |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
какие угодно. все зависит от того что будет в цикле, и как оно работает.
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |