crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

AD
  опции профиля:
сообщение 4.6.2009, 16:49
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Не понимаю, почему нет паузы в выполнении. Делаю так:
connect(btnPauseVertical, SIGNAL(clicked()), this, SLOT(pauseVerticalCycles()));
/// Приостановка выполнения процесса перемещения в вертикальной проекции (или запуск с места остановки)
void AutoControl::pauseVerticalCycles()
{
    if(btnPauseVertical -> isChecked())
    {
        bool p = vertical -> wait();
        int u = 0;
    }
    /*else
        vertical -> start();*/
}

В чем недочеты? Почему не удается приостановить выполнение функции run()?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
igor_bogomolov
  опции профиля:
сообщение 5.6.2009, 0:52
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


AD, мне всегда нравились твои краткие примеры ;)

То что ты cделал противоречит тобою же поставленной задачей.
Цитата(AD)
приостанавливать выполнение run(), а потом запускать run() с места остановки?

То, что ты делаешь, это называется завершение потока
Цитата
if(terminated) return;

А в дальнейшем, ты создаешь его заново
Цитата
vertical -> start();
т.е выполнение начнется с первой строки метода run.

В строке
if(!number_rotate) { terminated = false; quit(); }
quit убери, он тут ни к чему. Поток и так завершится.

Если ты реально хочешь приостановиь поток, а потом продолжить с места остановки, используй QMutex совместно с QWaitCondition. Да и в принципе мьютексами пользоваться не стесняйся ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 5.6.2009, 10:03
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(igor_bogomolov @ 5.6.2009, 1:52) *
Если ты реально хочешь приостановиь поток, а потом продолжить с места остановки, используй QMutex совместно с QWaitCondition. Да и в принципе мьютексами пользоваться не стесняйся ;)

Если бы знал, как корректно ими воспользоваться - обязательно бы это сделал! ;) :) Подскажешь, буду благодарен! :)

А вообще, да, я запускаю run с первой строчки, но:
1) у меня цикл начинается с места остановки;
2) условие, которое проверяется перед циклом, не выполняется, потому что прожектор и так, в крайнем верхнем положении!

P.S.
Подкорректировал код:
private slots:
void terminateCycle(int index) { terminated = true; }

/// Выполнение цикла перемещений прожектора
void VerticalRotation::cycleRotate()
{
    int geted_angle_elev = VALFROMBYTES(inf_from_ed_packet.high_angle_elev, inf_from_ed_packet.low_angle_elev);
    readAngleElevation(geted_angle_elev, 10.);

    const int number_cycles = number_rotate;
    for(register int i=0; i<number_cycles && !terminated; i++)
    {
        int angle_elevation = -110 * 10;
        inf_to_ed_packet.low_angle_elev = LOWBYTE(angle_elevation);
        inf_to_ed_packet.high_angle_elev = HIGHBYTE(angle_elevation);
        if(imitTsl) imitTsl -> writeFromCtrlAutoPage();
        readAngleElevation(geted_angle_elev, -110.);

        angle_elevation = 10 * 10;
        inf_to_ed_packet.low_angle_elev = LOWBYTE(angle_elevation);
        inf_to_ed_packet.high_angle_elev = HIGHBYTE(angle_elevation);
        if(imitTsl) imitTsl -> writeFromCtrlAutoPage();
        readAngleElevation(geted_angle_elev, 10.);
        --number_rotate;
        emit valueDecrement(number_rotate);
        if(checked_pause) emit timeout(i);
    }
}

/// Запуск потока вращения в вертикальной плоскости
void VerticalRotation::run()
{
    if(!number_rotate) return;
    if(terminated) return;

    int geted_angle_elev = VALFROMBYTES(inf_from_ed_packet.high_angle_elev, inf_from_ed_packet.low_angle_elev);
    int angle_elevation = 10 * 10;                        ///< верхний предел прожектора
    if(geted_angle_elev < ((10. - 1.5) * 10) || geted_angle_elev > ((10. + 1.5) * 10))
    {
        inf_to_ed_packet.low_angle_elev = LOWBYTE(angle_elevation);
        inf_to_ed_packet.high_angle_elev = HIGHBYTE(angle_elevation);
        if(imitTsl) imitTsl -> writeFromCtrlAutoPage();
    }

    /// внешний цикл по количеству перемещений
    cycleRotate();

    if(!number_rotate) { checked_pause = false; terminated = false; quit(); }
}


/// Приостановка выполнения процесса перемещения в вертикальной проекции (или запуск с места остановки)
void AutoControl::pauseVerticalCycles()
{
    if(btnPauseVertical -> isChecked())
    {
        vertical -> setChecked(true);
        vertical -> setTerminate(true);
        btnPauseVertical -> setFlat(true);
    }
    else
    {
        vertical -> setChecked(false);
        vertical -> setTerminate(false);
        vertical -> start();
        btnPauseVertical -> setFlat(false);
    }
}


Сообщение отредактировал AD - 5.6.2009, 10:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- AD   Приостановка потока   4.6.2009, 16:49
- - BRE   Цитата(AD @ 4.6.2009, 17:49) Не понимаю, ...   4.6.2009, 17:35
|- - AD   Тогда вопрос: как заставить его таймаутиться? Даж...   4.6.2009, 17:37
|- - BRE   Цитата(AD @ 4.6.2009, 18:37) Тогда вопрос...   4.6.2009, 18:02
|- - AD   Ну.... мне удалось сделать такую фишку! Вот ...   4.6.2009, 19:06
- - igor_bogomolov   AD, мне всегда нравились твои краткие примеры Т...   5.6.2009, 0:52
|- - AD   Цитата(igor_bogomolov @ 5.6.2009, 1:52) Е...   5.6.2009, 10:03
- - Litkevich Yuriy   AD, сворачивай код, слишком длинный   5.6.2009, 10:06
- - igor_bogomolov   Цитата(AD @ 5.6.2009, 11:03) 2) условие, ...   5.6.2009, 10:24
|- - AD   Цитата(igor_bogomolov @ 5.6.2009, 11:24) ...   5.6.2009, 10:29
- - igor_bogomolov   Цитата(AD @ 5.6.2009, 11:29) Вот то что н...   5.6.2009, 11:01
|- - AD   Хорошо, quit() убрал. Цитата(igor_bogomolov ...   5.6.2009, 11:29
- - igor_bogomolov   Вот простенький пример, как приостановить поток пр...   5.6.2009, 13:00
- - flankerr   #include <sys/timeb.h> #include <time....   8.6.2009, 13:12
|- - BRE   Цитата(flankerr @ 8.6.2009, 14:12) просто...   8.6.2009, 13:25
- - flankerr   иногда,в тех случаях когда пауза небольшая и загру...   8.6.2009, 14:14
|- - BRE   Цитата(flankerr @ 8.6.2009, 15:14) иногда...   8.6.2009, 15:02
- - Litkevich Yuriy   тему разделил, см. sleep в main'е Всё таки от ...   8.6.2009, 18:19


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 15.7.2025, 1:56