Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Остановка бесконечного цикла


Автор: VKlim 6.7.2007, 09:05
У меня есть форма. По нажатию кнопки "СТАРТ" в com-порт начинают непрерывно отправляться данные. Данные отправляются в бесконечном цикле. По нажатию кнопки "СТОП" надо бы этот процесс остановить. Подскажите пожалуйста, как это сделать?

Автор: Damarus 6.7.2007, 09:11
Отдельный поток. По нажатию СТАРТ запускаешь, по СТОП - останавливаешь.

Автор: Rodman 6.7.2007, 09:11
мне кажется лучше сделать таймером, тогда по нажатию на "СТОП" должно нормально останавливаться!

но чесно говоря не видя того, что у тебя есть трудно судить о том - что не получается!

Добавлено через 30 секунд
а выход из цикла - break!!!

Автор: VKlim 6.7.2007, 09:14
Rodman, 
ЗА break спасибо!  smile 

Но мне надо узнать, когда этот break выполнить. Какое событие отследить. 
Уважаемые,  smile 

Автор: Rodman 6.7.2007, 09:18
ну попробуй создай глобальную переменную: задай ей значение 0, а при нажатии на кнопку "СТОП" приравняй к 1...

а в цикле просто проверяй на равенство единице - если истина то break

Автор: VKlim 6.7.2007, 09:25
Rodman, 
Это я понимаю. Вся проблема в том, что кнопка бесконечный цикл деактивирует форму. Соответственно, ни одна кнопка на ней не тыкается

Автор: Rodman 6.7.2007, 09:39
Код

void __fastcall TForm1::MyFunc()
{
        for(;;)
        {
                Application->ProcessMessages();
                if(i==1)
                        break;
                Application->ProcessMessages();
        }
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
      i=0;
      MyFunc();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
        i=1;
}

Автор: Klin 6.7.2007, 12:12
Rodman, прикольный синтаксис smile Но мне кажется, что лучше по старинке:

Обяъвление (глобально)
Код

 bool stop = false;


Цикл
Код

while (!stop) {
 // ваши действия
 Application->ProcessMessages(); // обязательно иначе циклу будет пофиг на остальные действия
}


Остановка
Код

 stop = true;

Автор: Fazil6 6.7.2007, 12:29
Цитата(Klin @  6.7.2007,  12:12 Найти цитируемый пост)
Но мне кажется, что лучше по старинке:
 гениально... и чем же оно лучше?

Автор: Klin 6.7.2007, 13:44
Fazil6, используем цикл вместе с условием (если тебя это не устраивает обратись к разработчикам с жалобой на while), вызов ProcessMessages не обязательно писать два раза (до действий и после) и третье использовать логическую переменную гораздо рациональней, чем использовать integer.

Добавлено через 4 минуты и 16 секунд
хотя тип в коде не указан smile

Автор: zkv 6.7.2007, 14:07
Цитата(Damarus @  6.7.2007,  09:11 Найти цитируемый пост)
Отдельный поток. По нажатию СТАРТ запускаешь, по СТОП - останавливаешь. 

поддерживаю, особенно если нужно переслать существенный объем данных, остальное - костыли (естественно - имхо)
организуется просто: ()
Код

//MyClass.h
class CMyClass 
{
private:
    bool m_fContinueThread;
public:
    CMyClass();
    ~CMyClass ();
    bool IsPressingContinue()
    { return m_fContinueThread; }
    void Stop();
    void Start();
};
//MyClass.cpp
static void ThreadSendData( void *cpyThis );

CMyClass::CMyClass()
{
    m_nTimer = 0;
    m_fContinueThread = false;
}

CMyClass::~CMyClass()
{
    Stop();
//тут следовало бы подождать - WaitForSingleObject, ну сам справишься ;)
}
void CMyClass::Start()
{
    m_fContinueThread = true;
    _beginthread( ThreadSendData, 0, this ); 
}

void CMyClass::Stop()
{
    m_fContinueThread = false;
}

void ThreadSendData( void *cpyThis )
{
    CMyClass *pMyClass = reinterpret_cast<CMyClass *>( cpyThis );
    while( pBut->IsPressingContinue() )
    {
        pMyClass->SendData( something, somewhere );//чего-то куда-то шлем
    }
}

Билдер поддерживает ведь _beginthread?

Автор: Klin 6.7.2007, 14:16
Цитата(zkv @  6.7.2007,  15:07 Найти цитируемый пост)
Билдер поддерживает ведь _beginthread?

да

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)