Форум программистов, компьютерный форум CyberForum.ru

Выполнение действий с возможностью действия - C++

Восстановить пароль Регистрация
 
Xantrax
16 / 16 / 1
Регистрация: 28.11.2012
Сообщений: 328
28.08.2013, 18:27     Выполнение действий с возможностью действия #1
Извиняюсь за теоретический вопрос, но все же попробую обратиться к вашим экстрасенсорным способностям.

Есть последовательность действий(функции выполняющие определенные действия) которую нужно выполнять, есть переменная-переключатель действий(int a), изменение которой должно приводить к переключению действий. Я с помощью таймера контролирую значение этой переменной(переключателья действия) и в зависимости от значения выполняю действие.
Выглядит это примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
int i = 0;
 
void TForm1::ButtonClick()
{
    if(i==0)
    {
        Timer1->Enable = true; // по нажатию кнопки включаю таймер
        i++;
    }
     else if(i!=0)
    {
         Timer1->Enable = false;//
         i = 0;
     }
}
 
 
void TForm::TimerStart()              //Работа таймера с установленным интервалом 
{
    switch(a)
    {
        case 0:
        {
            действие0();
            a = 2;
            break;
        }
        case 1:
        {
            действие1();
            a = 2;
            break;
        }
        case 2:
        {
            действие2();
        if(определенные обстоятельства)
        {
            a = 1;
            break;
        }
         a = 0;
         break;
       }
    }
}
Проблема в том, что тики таймера приходят во время когда, допустим, выполняется действие 2 и переменная все еще равна тому значению для выполнения второго действия, соответственно программа вновь начинает выполнять второе действие....
Как реализовать цикл с точным выполнением действий и возможностью выхода из этого цикла?
Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
28.08.2013, 18:41     Выполнение действий с возможностью действия #2
можно поставить флаг занятости
например так
C++
1
2
3
4
5
6
7
8
9
10
11
case 0:
 {
   if(flag==0)
    {  
     flag=1;
     действие0();
      a = 2;
      flag=0;
      }
      break;
    }
можно воспользоваться семафорами, мютексами
Xantrax
16 / 16 / 1
Регистрация: 28.11.2012
Сообщений: 328
28.08.2013, 19:26  [ТС]     Выполнение действий с возможностью действия #3
можно поставить флаг занятости
C++
1
2
3
4
5
6
7
8
9
10
11
case 0:
 {
   if(flag==0)
    {  
     flag=1;
     действие0();
      a = 2;
      flag=0;
      }
      break;
    }
Не понял идею...
воспользоваться семафорами
У меня один процесс и поток...
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
28.08.2013, 19:37     Выполнение действий с возможностью действия #4
смотри
при первом заходе flag равен 0
значит заходим в тело условия
задаем flag =1
выполняем действие0();
в это время таймер опять срабатывает но флаг равен 1
значит условие не срабатывает и выходим из обработчика
действие0(); закончилось
и flag опять обнулился
при следуешем срабатывании таймера можем опять производить действия
можно вообще весь свич обернуть этим условием
разумеется flag не может быть локальной переменной, иначе каждый раз при заходе в функцию будет создаватся заново
или глобальная или статическая или член класса
Yandex
Объявления
28.08.2013, 19:37     Выполнение действий с возможностью действия
Ответ Создать тему
Опции темы

Текущее время: 08:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru