Problem mit Verzögerung zwischen zwei Funktionen



  • Hi,

    also mein Vorhaben:
    1. Funktion aufrufen, 3 Sekunden warten, 2. Funktion aufrufen
    (Die Funktionen simulieren jeweils einen Tastendruck)

    Der Quelltext:

    void superfunktion(unsigned char key);
    void delay(int D);
    int zufallszahl(int zahl);
    char typumwandlung(AnsiString wert);
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void superfunktion(unsigned char key)
    {
     keybd_event(key,MapVirtualKey(key,0),0,0);
     Sleep(zufallszahl(80));
     keybd_event(key,MapVirtualKey(key,0), KEYEVENTF_KEYUP, 0);
    }
    
    //-----------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    randomize();
    }
    //---------------------------------------------------------------------------
    
    void delay(int D)
    {
      for (int i = 0; i < D; i += 50) 
      { 
        Sleep(50); 
        Application->ProcessMessages();
      }
    }
    
    //---------------------------------------------------------------
    
    int zufallszahl(int zahl)
    {
    int a;
    do
    {
    a= random(zahl);
    }while(a<=39);
    return a;
    }
    
    //---------------------------------------------------------------
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    superfunktion(typumwandlung(Edit1->Text));
    delay(3000);
    superfunktion(typumwandlung(Edit2->Text));
    delay(3000);
    Timer1->Enabled=false;
    }
    //---------------------------------------------------------------------------
    
    char typumwandlung(AnsiString wert)
    {
    char ctext;
    ctext= *wert.c_str();
    return ctext;
    }
    

    Das Problem:

    Wenn man den Quelltext ausführt, wird das Zeichen in Edit1->Text korrekt simuliert, danach wird 3 sekunden gewartet, dann aber wird wieder das Edit1-Text Zeichen ausgegeben und nicht das Edit2->Text Zeichen. Außerdem reagiert das Programm überhaupt nicht mehr auf eingaben, es lässt sich nur noch mit dem Taskmanager beenden.

    Hat vielleicht jemand Lösungsvorschläge?

    Danke im Voraus
    ravel



  • Wiso rufst du im Timer eine weitere Zählschleife auf??? Damit blockierst du automatisch die anderen Anwendungen, und WIN blockiert dann das Programm. so das du es nur noch mit dem TM beenden kannst.
    Tipp, benutze im Timer eine Zählvariable(z.b. Typ int) und benutze if als Kontrollstruktur, zum starten der Superfunktion.
    Beispiel.

    int Sekunde=0;//Am besten im Header deklarieren, und im From_Create Ereignis initialisieren.
    ...
    ...
    ...
    
    //--------------------------------------------------------------- 
    void __fastcall TForm1::Timer1Timer(TObject *Sender) 
    { 
    if(Sekunde==0)
       superfunktion(typumwandlung(Edit1->Text)); 
    if(Sekunde==3)
       superfunktion(typumwandlung(Edit2->Text)); 
    if(Sekunde==6)
       Timer1->Enabled=false; 
    Sekunde++;
    } 
    //---------------------------------------------------------------------------
    

    Dies bezieht sich auf eine Timereinstellung von 1 Sekunde.
    Beim aktivieren des Timers während der Laufzeit, sollte die Variable Sekunde wieder auf 0 zurückgesetzt werden. Ich hoffe das hilft weiter 😉



  • Siehe auch "State Machine"

    -junix



  • SnoopyAtHome schrieb:

    int Sekunde=0;//Am besten im Header deklarieren, und im From_Create Ereignis initialisieren.
    

    Wieso?

    -junix



  • Weil ich es gelernt habe, das man die Variablendeklarationen in der Formulars Klasse die im Header steht macht, insofern diese Variable dann in den Kassenfunktionen benötigt wird. Natürlich kann man auch die Variable direkt in der Funktion deklarieren, mann sollte sich nur dann bewust sein, das diese dann eine bedingte Lebensdauer hat, und diese sich dann nur auf die Funktion beschränkt. Und so wie ich es gemacht hatte, da würde mir mein Prof. wieder den Sinn von OOP und Datenkapselung erneut beibringen 😉



  • Snoopy_at_Home schrieb:

    Weil ich es gelernt habe, das man die Variablendeklarationen in der Formulars Klasse die im Header steht macht, insofern diese Variable dann in den Kassenfunktionen benötigt wird.

    Äh ja, wobei zu erwähnen ist, dass diese Variable als Membervariable der Klasse zu deklarieren ist. Die Initialisierung empfiehlt sich dann übrigens beim einzig wirklich vorhersehbaren Event - dem Konstruktor - alles Andere ist nicht empfehlenswert.

    Snoopy_at_Home schrieb:

    Natürlich kann man auch die Variable direkt in der Funktion deklarieren, mann sollte sich nur dann bewust sein, das diese dann eine bedingte Lebensdauer hat

    Eine Static-Variable wäre da z.B. eine Lösung. Ist aber in der Tat unschön, da man ausschliesslich innerhalb dieser Methode zugriff hat, während man sonst vielleicht vom TimerCounter anderweitig profitieren könnte.

    Snoopy_at_Home schrieb:

    Und so wie ich es gemacht hatte, da würde mir mein Prof. wieder den Sinn von OOP und Datenkapselung erneut beibringen 😉

    ... du meinst globale Variablen? (o;

    Btw: Ich persönlich würde auf eine if-Orgie verzichten und switch-case verwenden...

    -junix


Log in to reply