| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] потоки: пуск/останов |
| Автор: Elfet 20.1.2010, 12:08 | ||||
| Ясно, спасибо! Можете ещё подсказать кое-что? Не хочу отдельную тему создавать. У меня на форме есть ещё две кнопки: Пауза и Стоп. Каким образом можно приостановить выполнение процесса и заново его запустить? Я сделал так:
И подключил слот Pause() к нужной кнопке на форме. А обратно запустить вычисления опять через run():
Нормально ли так? |
| Автор: Elfet 20.1.2010, 12:30 |
| Мне нужно реализовать итерационный процесс решения задачи, который можно с помощью кнопок на форме остановить, возобновить или прекратить вообще. |
| Автор: SABROG 20.1.2010, 12:46 |
| Я бы посмотрел в сторону QtConcurrent::map()/mapped(), он сам распараллеливает задачу на доступные ядра. Можно поставить на паузу, можно видеть прогресс. А вместо цикла for() должен быть список с задачами или значениями. |
| Автор: Elfet 20.1.2010, 13:08 |
| SABROG, вообще хотелось бы с помощью потоков. |
| Автор: JackYF 20.1.2010, 18:07 |
| Elfet, А надо. |
| Автор: SABROG 20.1.2010, 19:00 | ||
А это и есть отдельные потоки. |
| Автор: andrew_121 20.1.2010, 19:07 |
классно тема начинается, никаких вопросов! JackYF, переименуй пожалуйста тему: Qt, потоки, запуск/останов. |
| Автор: Elfet 20.1.2010, 23:10 |
| andrew_121, =)))) |
| Автор: maxxant 20.1.2010, 23:50 | ||||||||
Если пауза - имеется ввиду, приостановить цикл, а потом продолжить с того же места. Тогда наверное как-то так:
ну и конструкция вида:
Это обычно диагноз. Поскольку moveToThread() для самого класса потока делать вообщем-то не хорошо. А в коннектах этого сигнала к другим слотам обычно не указывается тип соединения, иногда указывают, но реже. Поэтому, если вдруг в логах (а может раз в месяц) появиться куча сообщений от каких-то сокетов (для X11) при потери связи с иксами или другие интересные глюки, то можно будет добавить в коннекте к слотам тип соединения Qt::QueuedConnection. (но это так догадки, возможно было где-то другое начало темы, начал читать со слов: "ясно, спасибо!"). А ещё лучше сразу сделать дополнительный класс, отдельный от класса потока. |
| Автор: Elfet 21.1.2010, 14:14 | ||||
Так лучше чем заново вызвать метод run()? А что в ней такого?
Что за дополнительный класс? Мне нужно создать отдельный поток с итерационным решением и возможностью его приостановить/возобновить или вообще остановить. |
| Автор: Elfet 21.1.2010, 14:37 | ||
И ещё я в документации про Qconcurrent прочитал следующее:
|
| Автор: SABROG 22.1.2010, 00:52 | ||||
Дык речь о методе run(), который не умеет практически ничего. Не умеет отправлять сигналы о состоянии прогресса, не может быть прерван, не умеет распараллеливать задачи. Я же рекомендовал использовать методы map() или mapped(), которые всё умеют. |
| Автор: Elfet 22.1.2010, 01:28 |
| Всё же мне не хочется использовать этот QtConcurren. Какие могут быть проблемы если я буду делать с QThread и событиями для остановки? |
| Автор: andrew_121 22.1.2010, 02:48 |
| какие угодно. все зависит от того что будет в цикле, и как оно работает. |
| Автор: maydjin 25.1.2010, 01:12 | ||||
Вариант с переменными
может вызвать довольно много проблемм, я бы предложил использовать для ваших целей класс QSemaphore делаеться это примерно так :
|