Остановка цикла.
От: BIG_PILOT Казахстан  
Дата: 06.08.03 14:45
Оценка:
Простите за глупый вопрос, но не могли бы ва мне пиплы помочь. Я начинающий программист так что не ругайтесь сильно. Вобщем суть вопроса: Имеется диалоговое приложение, по нажатию кнопки Start запускается большой цикл надо по нажатию кнопки Stop его остановить.
Пожалуйста не обделите ответом
Настоящие_программисты_пробел_не_используют
Re: Остановка цикла.
От: GarryIV  
Дата: 06.08.03 15:16
Оценка:
Здравствуйте, BIG_PILOT! Вы писали:

BP> Простите за глупый вопрос, но не могли бы ва мне пиплы помочь. Я

BP> начинающий программист так что не ругайтесь сильно. Вобщем суть
BP> вопроса: Имеется диалоговое приложение, по нажатию кнопки Start
BP> запускается большой цикл надо по нажатию кнопки Stop его остановить.
BP> Пожалуйста не обделите ответом

Запускай большой цикл в отдельной нити. В цикле время от времени проверяй флаг выхода. В MSDN есть примерчик про вычисления в отдельной нити.
Posted via RSDN NNTP Server 1.7 beta
WBR, Igor Evgrafov
Re: Остановка цикла.
От: Apapa Россия  
Дата: 06.08.03 15:16
Оценка:
Здравствуйте, BIG_PILOT, Вы писали:

BIG>Простите за глупый вопрос, но не могли бы ва мне пиплы помочь. Я начинающий программист так что не ругайтесь сильно. Вобщем суть вопроса: Имеется диалоговое приложение, по нажатию кнопки Start запускается большой цикл надо по нажатию кнопки Stop его остановить.

BIG>Пожалуйста не обделите ответом

Суть, видимо, такая:
— Создаешь глобальный флаг остановки BOOL bStop_Cycle
— Нажатие на Stop устанавливает bStop_Cycle = TRUE
— Цикл может выглядеть так:
bStop_Cycle = FALSE;
struct EXCEPTION_STOP { /* сюда можно дополнительную инфу о состоянии цикла в момент остановки запихнуть */ };
try {
    while (...) {
        ...
        if (bStop_Cycle) {
            throw EXCEPTION_STOP(...);
        }
        ...
    }
}
catch (EXCEPTION_STOP & es) {
    /* Откат сделанных в цикле действий, используя если нужно инфу из es */
}

— Не забыть сделать так, чтобы во время цикла кнопка Stop действовала! Т.е. обрабатывать сообщения (или поместить цикл в отдельный поток?)


Здесь могла бы быть Ваша реклама!
Re: Остановка цикла.
От: _VooDoo_  
Дата: 06.08.03 18:58
Оценка:
Здравствуйте, BIG_PILOT, Вы писали:

BP>Простите за глупый вопрос, но не могли бы ва мне пиплы помочь. Я начинающий программист так что не ругайтесь сильно. Вобщем суть вопроса: Имеется диалоговое приложение, по нажатию кнопки Start запускается большой цикл надо по нажатию кнопки Stop его остановить.

BP>Пожалуйста не обделите ответом

Может лучше сделать , чтобы при нажатии на Start стартовал поток, а потом при нажатии на Stop его останавливать

Может не очень эффектное решение, но все такиююю
... << RSDN@Home 1.0 beta 6a >>
Re: Остановка цикла.
От: Yaumen  
Дата: 07.08.03 05:14
Оценка:
Здравствуйте, BIG_PILOT, Вы писали:

BIG>Простите за глупый вопрос, но не могли бы ва мне пиплы помочь. Я начинающий программист так что не ругайтесь сильно. Вобщем суть вопроса: Имеется диалоговое приложение, по нажатию кнопки Start запускается большой цикл надо по нажатию кнопки Stop его остановить.

BIG>Пожалуйста не обделите ответом

Например так.

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

OnStart()
{
   m_bStop = FALSE;
   MSG message;
   for (int i = 0; (i < ...) && !m_bStop; i++)
   {
    if (::PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
    {
        ::TranslateMessage(&message);
        ::DispatchMessage(&message);
    }
        // Здесь ваш код
   }
}

OnStop()
{
   m_bStop = TRUE;
}


Блок кода с PeekMessage можно вызывать не в каждом цикле, а скажем раз в 16-ть циклов, тогда просто добавьте еще одно условие ограничивающее периодичность.
Re: Остановка цикла.
От: BIG_PILOT Казахстан  
Дата: 08.08.03 20:35
Оценка:
Всем спасибо за участие. Не знаю что бы я без вас делал.
Настоящие_программисты_пробел_не_используют
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.