Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Остановка бесконечного цикла 
:(
    Опции темы
VKlim
Дата 6.7.2007, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня есть форма. По нажатию кнопки "СТАРТ" в com-порт начинают непрерывно отправляться данные. Данные отправляются в бесконечном цикле. По нажатию кнопки "СТОП" надо бы этот процесс остановить. Подскажите пожалуйста, как это сделать?
PM MAIL   Вверх
Damarus
Дата 6.7.2007, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Отдельный поток. По нажатию СТАРТ запускаешь, по СТОП - останавливаешь.
PM MAIL ICQ Jabber   Вверх
Rodman
Дата 6.7.2007, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

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



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

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

Добавлено через 30 секунд
а выход из цикла - break!!!
PM MAIL WWW Skype GTalk YIM MSN   Вверх
VKlim
Дата 6.7.2007, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Rodman
ЗА break спасибо!  smile 

Но мне надо узнать, когда этот break выполнить. Какое событие отследить. 
Уважаемые,  smile 
PM MAIL   Вверх
Rodman
Дата 6.7.2007, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

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



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

а в цикле просто проверяй на равенство единице - если истина то break
PM MAIL WWW Skype GTalk YIM MSN   Вверх
VKlim
Дата 6.7.2007, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Rodman
Это я понимаю. Вся проблема в том, что кнопка бесконечный цикл деактивирует форму. Соответственно, ни одна кнопка на ней не тыкается
PM MAIL   Вверх
Rodman
Дата 6.7.2007, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

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



Код

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;
}

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


Эксперт
***


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

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



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

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

 bool stop = false;


Цикл
Код

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


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

 stop = true;


Это сообщение отредактировал(а) Klin - 6.7.2007, 13:52


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Fazil6
Дата 6.7.2007, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

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


Эксперт
***


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

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



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

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

Это сообщение отредактировал(а) Klin - 6.7.2007, 13:45


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
zkv
Дата 6.7.2007, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



Цитата(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?

Это сообщение отредактировал(а) zkv - 6.7.2007, 15:22
PM MAIL   Вверх
Klin
Дата 6.7.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

да


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




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


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

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