Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] потоки: пуск/останов 
:(
    Опции темы
Elfet
  Дата 20.1.2010, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Ясно, спасибо!

Можете ещё подсказать кое-что? Не хочу отдельную тему создавать. 

У меня на форме есть ещё две кнопки: Пауза и Стоп.
Каким образом можно приостановить выполнение процесса и заново его запустить?

Я сделал так:
Код

void IterationThread::run()
{
    is_runing = true;
    for(; i <= 100; i++)
    {
        emit Progress(i);
        msleep(100);
        if(!is_runing)
        {
            return;
        }
    }
}

void IterationThread::Pause()
{
    is_runing = false;
}


И подключил слот Pause() к нужной кнопке на форме. А обратно запустить вычисления опять через run():
Код

iterationThread->run();


Нормально ли так?


--------------------
PM MAIL WWW Skype   Вверх
andrew_121
Дата 20.1.2010, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Цитата(Elfet @  20.1.2010,  12:08 Найти цитируемый пост)
Каким образом можно приостановить выполнение процесса и заново его запустить?

никаким.
можно в метод потока вставить бесконечный цикл, и его останавливать/возобновлять.

Добавлено через 1 минуту и 5 секунд
Цитата(Elfet @  20.1.2010,  12:08 Найти цитируемый пост)
Нормально ли так? 

нет. это уже будет не в потоке.

Добавлено через 3 минуты и 8 секунд
по приведенному вами коду, мне кажется, что можно использовать QWaitCondition, или тупо мьютекс. сложно что-то более точно сказать, так как детали не понятны.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Elfet
Дата 20.1.2010, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Мне нужно реализовать итерационный процесс решения задачи, который можно с помощью кнопок на форме остановить, возобновить или прекратить вообще.


--------------------
PM MAIL WWW Skype   Вверх
SABROG
Дата 20.1.2010, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Я бы посмотрел в сторону QtConcurrent::map()/mapped(), он сам распараллеливает задачу на доступные ядра. Можно поставить на паузу, можно видеть прогресс. А вместо цикла for() должен быть список с задачами или значениями.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Elfet
Дата 20.1.2010, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



SABROG, вообще хотелось бы с помощью потоков. 


--------------------
PM MAIL WWW Skype   Вверх
JackYF
Дата 20.1.2010, 18:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



Elfet, 
Цитата(Elfet @  20.1.2010,  11:08 Найти цитируемый пост)
Не хочу отдельную тему создавать. 

А надо.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
SABROG
Дата 20.1.2010, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(Elfet @ 20.1.2010,  13:08)
SABROG, вообще хотелось бы с помощью потоков.

А это и есть отдельные потоки.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
andrew_121
Дата 20.1.2010, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Цитата(Elfet @  20.1.2010,  12:08 Найти цитируемый пост)
Ясно, спасибо!

классно тема начинается, никаких вопросов! smile 


JackYF, переименуй пожалуйста тему: Qt, потоки, запуск/останов.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Elfet
Дата 20.1.2010, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



andrew_121, =))))  smile 


--------------------
PM MAIL WWW Skype   Вверх
maxxant
Дата 20.1.2010, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 8.9.2009

Репутация: 1
Всего: 1



Цитата(Elfet @  20.1.2010,  12:08 Найти цитируемый пост)

У меня на форме есть ещё две кнопки: Пауза и Стоп.
Каким образом можно приостановить выполнение процесса и заново его запустить?

Я сделал так:

Код

void IterationThread::run()
{
    is_runing = true;
    for(; i <= 100; i++)
    {
        emit Progress(i);
        msleep(100);
        if(!is_runing)
        {
            return;
        }
    }
}
void IterationThread::Pause()
{
    is_runing = false;
}




Если пауза - имеется ввиду, приостановить цикл, а потом продолжить с того же места. Тогда наверное как-то так:

Код

void IterationThread::run()
{
    doPause = false;
    doStop   = false;

    for(; i <= 100; i++)
    {
        emit Progress(i);
        msleep(100);
        if(doStop)
        {
            return;
        }
        while(doPause)
        {
           msleep(xxx); // 20 - 50 ms
           if(doStop) return;
        }
    }
}
void IterationThread::Pause(bool on)
{
    doPause = on;
}
void IterationThread::Stop()
{
    doStop = false;
}


ну и конструкция вида:

Код

void IterationThread::run()
{
   ...
        emit Progress(i);
   ...
}


Это обычно диагноз. Поскольку moveToThread() для самого класса потока делать вообщем-то не хорошо. А в коннектах этого сигнала к другим слотам обычно не указывается тип соединения, иногда указывают, но реже. Поэтому, если вдруг в логах (а может раз в месяц) появиться куча сообщений от каких-то сокетов (для X11) при потери связи с иксами или другие интересные глюки, то можно будет добавить в коннекте к слотам тип соединения Qt::QueuedConnection. (но это так догадки, возможно было где-то другое начало темы, начал читать со слов: "ясно, спасибо!"). А ещё лучше сразу сделать дополнительный класс, отдельный от класса потока.


PM MAIL   Вверх
Elfet
Дата 21.1.2010, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Цитата(maxxant @  21.1.2010,  00:50 Найти цитируемый пост)
Если пауза - имеется ввиду, приостановить цикл, а потом продолжить с того же места. Тогда наверное как-то так:

Так лучше чем заново вызвать метод run()?

Цитата(maxxant @  21.1.2010,  00:50 Найти цитируемый пост)
ну и конструкция вида:

А что в ней такого?

Цитата(maxxant @  21.1.2010,  00:50 Найти цитируемый пост)
А ещё лучше сразу сделать дополнительный класс, отдельный от класса потока.

Что за дополнительный класс? 


Мне нужно создать отдельный поток с итерационным решением и возможностью его приостановить/возобновить или вообще остановить.



--------------------
PM MAIL WWW Skype   Вверх
Elfet
Дата 21.1.2010, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



И ещё я в документации про Qconcurrent прочитал следующее:
Цитата
the future returned by QtConcurrent::run() cannot be canceled;



--------------------
PM MAIL WWW Skype   Вверх
SABROG
Дата 22.1.2010, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(Elfet @ 21.1.2010,  14:37)
И ещё я в документации про Qconcurrent прочитал следующее:
Цитата
the future returned by QtConcurrent::run() cannot be canceled;

Дык речь о методе run(), который не умеет практически ничего. Не умеет отправлять сигналы о состоянии прогресса, не может быть прерван, не умеет распараллеливать задачи. Я же рекомендовал использовать методы map() или mapped(), которые всё умеют.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Elfet
Дата 22.1.2010, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Всё же мне не хочется использовать этот QtConcurren.

Какие могут быть проблемы если я буду делать с QThread и событиями для остановки? 



--------------------
PM MAIL WWW Skype   Вверх
andrew_121
Дата 22.1.2010, 02:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



какие угодно. все зависит от того что будет в цикле, и как оно работает.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0577 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.