Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Остановка цикла, :) 
V
    Опции темы
FlightOfDeath
Дата 1.2.2008, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как сделать чтобы при работе какого либо цикла, можно было в любой момент его остановить с помощью нажатия кнопки? 
PM MAIL WWW ICQ   Вверх
JackYF
Дата 1.2.2008, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



FlightOfDeath, потрудись указать ОС, средства разработки, компилятор, характер цикла или примерный исходник.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
FlightOfDeath
Дата 1.2.2008, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(JackYF @ 1.2.2008,  20:18)
FlightOfDeath, потрудись указать ОС, средства разработки, компилятор, характер цикла или примерный исходник.

Windows XP, Borland C++Builder 6, цикл покачто просто увеличивает число... но нужно чтобы в любой момент можно было прервать этот цикл.

Это сообщение отредактировал(а) FlightOfDeath - 1.2.2008, 20:28
PM MAIL WWW ICQ   Вверх
N0dwis
Дата 1.2.2008, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Запустить цикл в отдельном потоке, в основном потоке в это время получать сообщения от клавиатуры, если нажата клавиша, установить какой-нибудь флаг, а в цикл вставить проверку, если флаг установлен - break;
PM MAIL   Вверх
FlightOfDeath
Дата 1.2.2008, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(N0dwis @ 1.2.2008,  20:36)
Запустить цикл в отдельном потоке, в основном потоке в это время получать сообщения от клавиатуры, если нажата клавиша, установить какой-нибудь флаг, а в цикл вставить проверку, если флаг установлен - break;

можно поподробней? лучше с примером, просто я с потоками не знаком :(
PM MAIL WWW ICQ   Вверх
new_web
Дата 1.2.2008, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Билдер даёт этому корявое, но - решение - записать цикл в таймере.
А кнопкой:
Код

Timer1->Enabled=false;


Только там интервал  меньше  (около 13 мкс) не получится!

PM MAIL   Вверх
EnergoHokum
Дата 2.2.2008, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код


#include <stdio.h>
#include <string.h>
#include <windows.h>

HANDLE hThread;//Описатель (хендл) потока
int flag;//Флаг, просто флаг

DWORD WINAPI LoopThread(LPVOID lpVoid)
{//Функция, выполняемая потоком
    int inc_value=0;//Переменная, которую хотим увеличивать
    while(1)
    {//"Бесконечный" цикл
        if(flag)//Если флаг не ноль,
            return 1;//Завершаем поток
        ++inc_value;
        ::Sleep(150);//Небольшая задержка
    }
    return 0;
}

int main(int argc,char** argv)
{
    flag=0;//Флаг устанавливаем в ноль
    char command[0xFF];//Сода будем писать ввод с клавиатуры
    char quit[]="quit";//Если будет введено это -- выйдем из программы

    /* Попытка создать поток. Если не получилось
         -- сообщаем и завершаем программу */
    if((hThread=::CreateThread(NULL,0,LoopThread,NULL,0,NULL)) == NULL)
    { printf("Can`not create thread\n"); return -1; }
    
    while(1)
    {//"Бесконечный" цикл, где ожидаем ввода с клавиатуры
        command[0]='\0';//"Затираем" предыдущий ввод с клавиатуры
        scanf("%s",command);//Записываем слово в массив
        if(!strcmp(command,quit))//Если ввели "quit" --
        {
            flag=1;//устанавливаем флаг
            /* и ждём не более 300 секунд, когда завершится поток. Если за это
                 время поток не завершился самостоятельно (мало-ли что!!!) */
            if(::WaitForSingleObject(hThread,300) != WAIT_OBJECT_0)
                ::TerminateThread(hThread,1);//Прибьём его вручную
            break;//И выходим из цикла
        }
    }

    return 0;//И из программы тоже
}//Это компилируется и запускается, и даже работает так, как задумано


PM MAIL ICQ   Вверх
FlightOfDeath
Дата 2.2.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



EnergoHokum, Спасибо огромное за помощь!  smile  smile 


M
JackYF
не забываем помечать тему решённой.


Это сообщение отредактировал(а) JackYF - 2.2.2008, 12:36
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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