Odmierzenie trzech czasów za pomocą Timera

0

Szukam odpowiedzi na moje początkujące pytanie związane z Timerami.

Mam pewien kod który coś wykonuje. W tym kodzie są funkcje Sleep(100) i Sleep(1000);
Niestety funkcja Sleep zatrzymuje działanie programu.

Jak mogę zrobić aby odczekać ten czas nie blokując działania całego programu.

void __fastcall TForm3::Timer2Timer(TObject *Sender)  // timer odpalany co 5 sekund
{
       Label1->Caption=Start;
       Sleep(100);  // Tutaj chciałbym odmierzyć czas nie blokując programu i przejść do wykonania następnej linii
       Label1->Caption=Stop;
       Sleep(1000);
} 
0
void __fastcall TForm3::Timer2Timer(TObject *Sender)  // timer odpalany co 5 sekund
{
       if(Timer2->Tag==0)
       {
              Label1->Caption=Start;
              Timer2->Interval=100;
              Timer2->Tag=1;
       }
       else if(Timer2.Tag==1)
       {
              Label1->Caption=Stop;
              Timer2->Interval=1000;
              Timer2->Tag=2;
       }
       else if(Timer2.Tag==2)
       {
              Label1->Caption="";
              Timer2->Interval=5000-1000--100;
              Timer2->Tag=0;
       }
}

Zastanów się nad stworzeniem odpowiedniej stałej struktury, wtedy kod będzie wyglądać tak:

void __fastcall TForm3::Timer2Timer(TObject *Sender)  // timer odpalany co 5 sekund
{
       int pos=Timer2->Tag;
       Label1->Caption=TimerInfo[pos].Text;
       Timer2->Interval=TimerInfo[pos].Interval;
       Timer2->Tag=(pos+1)%(sizeof(TimerInfo)/sizeof(*TimerInfo));
}
2

Sleep() blokuje wątek na określony czas. To że jest odpalane w timerze nic nie da, bo timer nie jest uruchamiany w osobnym wątku.

0

Czy może Ktoś wyjaśnić czemu jest tak.

Timer2->Interval=5000-1000--100; 

Jak by wyglądało gdyby było więcej tagów.

Co by było gdyby zrobić tak.

 Timer2->Interval=5000-1100;

Czy gdybym chciał odmierzać więcej czasów czy kod powinien wyglądać tak.

       if(Timer2->Tag==0)
       {
              Label1->Caption=Start;
              Timer2->Interval=100;
              Timer2->Tag=1;
       }
       else if(Timer2->Tag==1)
       {
              Label1->Caption=Stop;
              Timer2->Interval=1000;
              Timer2->Tag=2;
       }
       else if(Timer2->Tag==2)
       {
              Label1->Caption=Lewo;
              Timer2->Interval=500;
              Timer2->Tag=3;
       }
       else if(Timer2->Tag==3)
       {
              Label1->Caption=Prawo;
              Timer2->Interval=200;
              Timer2->Tag=4;
       }

       else if(Timer2->Tag==4)
       {
              Label1->Caption="";
              Timer2->Interval=5000-200-500-1000-100;
              Timer2->Tag=0;
       } 
1

Chodzi o to by czasy sumowali się do 5 sek, chyba że masz inny cykl.
Jeżeli masz więcej tego to na 100% lepiej zrób strukturę:

void __fastcall TForm3::Timer2Timer(TObject *Sender)  // timer odpalany co 5 sekund
{
       static struct { const char *Text; int Interval; } TimerInfo[]=
       {
              { Start,100 },
              { Strop,200 },
              { Lewo,500 },
              { Prawo,1000 },
              { "",3800 },
       };
       int pos=Timer2->Tag;
       Label1->Caption=TimerInfo[pos].Text;
       Timer2->Interval=TimerInfo[pos].Interval;
       Timer2->Tag=(pos+1)%(sizeof(TimerInfo)/sizeof(*TimerInfo));
}

zauważ że przy takim rozkładzie nie dasz rade popełnić takiego błędu jak z tą 2 zamiast 4

1 użytkowników online, w tym zalogowanych: 0, gości: 1