Qt Потоки (Приостановка и продолжение потока)

Модератор: Модераторы разделов

TwisT
Сообщения: 265
ОС: Debian

Qt Потоки

Сообщение TwisT »

Всем доброго времени суток
До этого никогда потоками не пользовался(аж стыдно)
Поток производит очень долгое мат статистическое вычисление
с приоритетом QThread::IdlePriority, т.к. скорости от меня никто не просил
По времени пару минут, но это нормально - 1000000 значений , каждое значение
среднее от 10000 итераций вычисления, не важно...
Заказчик хочет паузу на поток
sleep нам не доступен т.к. Static Protected Members
о у нас есть wait()
Правильно я понял: Чтобы приостановить поток нужно просто вызвать wait()
а что бы его продолжить нужно вызвать run(); естественно в обоих случаях проверить что поток вообще существует и выполняется?
Спасибо.
Linux user #432536.
Спасибо сказали:
Аватара пользователя
Val
Ведущий рубрики
Сообщения: 2211
Статус: Редактор LXF

Re: Qt Потоки

Сообщение Val »

TwisT писал(а):
16.10.2006 10:24
Всем доброго времени суток
До этого никогда потоками не пользовался(аж стыдно)
Поток производит очень долгое мат статистическое вычисление
с приоритетом QThread::IdlePriority, т.к. скорости от меня никто не просил
По времени пару минут, но это нормально - 1000000 значений , каждое значение
среднее от 10000 итераций вычисления, не важно...
Заказчик хочет паузу на поток
sleep нам не доступен т.к. Static Protected Members

И чего?

Код: Выделить всё

class MyThread: public QThread {
    bool suspend_flag;
    public:
         void suspend() {suspend_flag = true; while (suspend_flag) Thread::sleep(100);}
     void resume() {suspend_flag=false;}
}

Решение, надо заметить, красотой не блещет, но работать должно.

о у нас есть wait()
Правильно я понял: Чтобы приостановить поток нужно просто вызвать wait()

правильно - если Вам нужно приотсановить поток из которого был вызван wait(). До тех пор, пока не завершится поток для которого Вы вызвали wait() или не случится тайм-аут. Для того, чтобы приостановить выполнение процесса, эта штука непригодна.
"Если думаешь, говоришь, пишешь и подписываешь - не удивляйся." (с)
Спасибо сказали:
TwisT
Сообщения: 265
ОС: Debian

Re: Qt Потоки

Сообщение TwisT »

Протупил, спасибо.
Слышал что мона QEvent-ами в принципе потоками управлять
но это вроде для 4 версии библиотеки было.
Linux user #432536.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Qt Потоки

Сообщение v04bvs »

Val писал(а):
19.10.2006 18:42
TwisT писал(а):
16.10.2006 10:24

Всем доброго времени суток
До этого никогда потоками не пользовался(аж стыдно)
Поток производит очень долгое мат статистическое вычисление
с приоритетом QThread::IdlePriority, т.к. скорости от меня никто не просил
По времени пару минут, но это нормально - 1000000 значений , каждое значение
среднее от 10000 итераций вычисления, не важно...
Заказчик хочет паузу на поток
sleep нам не доступен т.к. Static Protected Members

И чего?

Код: Выделить всё

class MyThread: public QThread {
    bool suspend_flag;
    public:
         void suspend() {suspend_flag = true; while (suspend_flag) Thread::sleep(100);}
     void resume() {suspend_flag=false;}
}

Решение, надо заметить, красотой не блещет, но работать должно.


И как оно должно работать, что то я не соображу? Во-первых компилятор может преобразовать цикл в вечный, т.е. while(1) Thread::sleep(100); т.к. в цикле suspend_flag не меняется (хотя конечно Thread::sleep может делать чего нибудь, но всё же это опасно). Чтобы этого не было, его надо, как минимум, объявить volatile. Во-вторых я всё равно не пойму, как оно будет работать.
Спасибо сказали:
Аватара пользователя
Val
Ведущий рубрики
Сообщения: 2211
Статус: Редактор LXF

Re: Qt Потоки

Сообщение Val »

v04bvs писал(а):
20.10.2006 11:31
И как оно должно работать, что то я не соображу? Во-первых компилятор может преобразовать цикл в вечный, т.е. while(1) Thread::sleep(100); т.к. в цикле suspend_flag не меняется (хотя конечно Thread::sleep может делать чего нибудь, но всё же это опасно). Чтобы этого не было, его надо, как минимум, объявить volatile. Во-вторых я всё равно не пойму, как оно будет работать.

Насчет бесконечного цикла - volatile не помешает, согласен :) Хотя не думаю, что таакя агрессивная компиляция будет иметь место.

Update.
Клянул свежим взглядом на код - понял, в чем дело. :) Естественно, работать не будет - вызов suspend() в последующим Tread::sleep() заблокирует вызывающий тред. цикл со sleep() надо перенести в run().
"Если думаешь, говоришь, пишешь и подписываешь - не удивляйся." (с)
Спасибо сказали: