Zeitlich definiertes Aussteigen aus einer while-Schleife



  • WhileBrecher schrieb:

    Danke schonmal.

    Kann ich den Timer nach seinem aktuellen Wert abfragen?

    Frag doch einfach Enabled ab und setze Enabled beim ersten Timer-Ereignis
    auf false.

    Gruß,

    Alexander



  • So hab ich das auch schon probiert, komme jedoch wenn ich in der Schleife drin bin nicht zum OnTimer-Ereignis und dem darin platzierten Code.



  • so wird das auch nix
    starte den timer vor deiner schleife und setzt bei OnTimer eine abbruchbedingung für deine schleife (z.B.: Abbruch = true)
    in der While-Schleife testet du dann auf Abbruch
    und vergess nicht den Timer im OnTimer-Ereignis auszuschalten



  • WhileBrecher schrieb:

    So hab ich das auch schon probiert, komme jedoch wenn ich in der Schleife drin bin nicht zum OnTimer-Ereignis und dem darin platzierten Code.

    Dann mußt Du in jedem Durchlauf Deiner Schleife vor dem Abprüfen der Enabled-
    Eigenschaft dem Programm die Chance geben, Ereignisse zu verarbeiten. Ich bin
    mir nicht ganz sicher, wie der Aufruf dafür lautet (in VB DoEvents). Das steht
    aber bestimmt in der FAQ oder der Hilfe.

    Gruß,

    Alexander



  • Jester2000 schrieb:

    (mit SecondsBetween oder MilliSecondsBetween)

    Wie soll das aussehen, in der Hilfe ist dazu nichts vermerkt?



  • Jester2000 schrieb:

    so wird das auch nix
    starte den timer vor deiner schleife und setzt bei OnTimer eine abbruchbedingung für deine schleife (z.B.: Abbruch = true)
    in der While-Schleife testet du dann auf Abbruch
    und vergess nicht den Timer im OnTimer-Ereignis auszuschalten

    Habe ich genauso gemacht und kam nicht zur OnTimer-Routine.



  • WhileBrecher schrieb:

    in der Hilfe ist dazu nichts vermerkt?

    glaub ich nicht

    TDateTime StartZeit = Now();
    
    while(SecondsBetween(Now(), StartZeit)<1)
    { ...
    }
    


  • WhileBrecher schrieb:

    Habe ich genauso gemacht und kam nicht zur OnTimer-Routine.

    was genau hast du denn gemacht, zeig mal deinen sourcecode



  • WhileBrecher schrieb:

    Habe ich genauso gemacht und kam nicht zur OnTimer-Routine.

    Schau mal in diesen Beitrag rein. Das müßte eigentlich das Timer-Problem
    lösen.

    Gruß,

    Alexander



  • Hier die while-Schleife

    var = 1;
    while (var)
              {
              if (ComGetEvent(Eingabe))
                 {
                 var = 0;
                 }
              if (TimerEmpfang->Enabled)
                 {
                 var = 0;
                 }
              }
    

    Und hier OnTimer

    HeebMain->TimerEmpfang->Enabled = false;
    


  • machs mal so:

    bool abbruch;     // global definieren
    
    abbruch = false;
    Timer1->Enabled = true;
    while(!abbruch)
    {
    }
    

    im OnTimer:

    Timer1->Enabled = false;
    abbruch = true;
    


  • TTimer ist ohnehin nicht das Mittel der Wahl für das Ausloten eines Communication-Timeouts.... QueryPerformanceCounter() liefert hier viel bessere Ergebnisse.

    Sehe ich das richtig, dass es darum geht, einen Timeout für den Datenempfang zu detektieren? Da gäbs nämlich elegantere Lösungen...

    -junix



  • junix schrieb:

    Sehe ich das richtig, dass es darum geht, einen Timeout für den Datenempfang zu detektieren? Da gäbs nämlich elegantere Lösungen...

    -junix

    un wat?



  • Mit CreateEvent, CloseHandle, WaitForSingleObject lassen sich ganz witzige Sachen machen (o: Wenn du nen Com-Port ansprichst, ist WaitCommEvent auch ganz Witzig. Vor Allem in Kombination mit WaitForSingleObject im OVERLAPPED-Betrieb.

    Ausserdem würde ich dir raten, die Kommunikation mit einem TThread-Objekt vom Dialog abzukoppeln.

    -junix

    [edit]Links eingefügt[/edit]



  • junix schrieb:

    Mit CreateEvent, CloseHandle, WaitForSingleObject lassen sich ganz witzige Sachen machen (o: Wenn du nen Com-Port ansprichst, ist WaitCommEvent auch ganz Witzig. Vor Allem in Kombination mit WaitForSingleObject im OVERLAPPED-Betrieb.

    Ausserdem würde ich dir raten, die Kommunikation mit einem TThread-Objekt vom Dialog abzukoppeln.
    [edit]Links eingefügt[/edit]

    Hallo junix,

    danke schon mal für die Hilfen. Nur mit dem WaitForSingleObject komme ich nicht ganz klar, da ich auf ein fertige Kommunikationsbibiothek zurückgreife.
    Mit ComGetEvent(Com-Port) bekomme ich entsprechend des Ereignisses ein Wert zurück. Wie muss ich das nun mit WaitForSingleObject verbinden um den PC nicht ständig zu überlasten (wie in einer while-Schleife), dem Warte-Thread jedoch eine hohe Priorität zu geben um keine Ereignisse an der Schnittstelle zu verpassen?
    Wäre über Hilfe sehr dankbar.

    Gruß WhileBrecher



  • Was für eine Bibliothek nutzt du denn? Eine hauseigene?

    -junix



  • junix schrieb:

    Was für eine Bibliothek nutzt du denn? Eine hauseigene?

    Nein, diese Bibliothek schimpft sich supercom.



  • Von hier: http://www.adontec.com/ ?
    ^Kenn ich nicht, aber hier müsstest du wohl mit der ComGetSetEventProc irgendwie ne Funktion aufsetzen die mit Setevent einen Event feuert... hmmm Kenn leider die Library nicht aber ich nehme an die oben von mir genannte Funktion dient dazu eine Callback Funktion zu setzen welche bei (beliebigen) events aufgerufen wird?

    -junix



  • Hi,

    das mit ComGetSetEventProc versteh ich gar nicht. Wie genau funktioniert CreateEvent und wie schaffe ich es das iich im entscheidenden Moment informiert werde?
    Hat vielleicht jemand ein verständliches Beispiel mit kurzer Erklärung?

    Frage ich nämlich ständig den Port in einem Thread ab:

    do
      {
      if (ComGetEvent(COM_1) == evRXRDY)
              {
              Readchar();
              }
      if (Terminated)
         return;
      }
      while (true);
    

    dann stürzt der Rechner nach ein paar Minuten ab. Die Prozessorauslastung beträgt in der aktiven Zeit ständig 100%.

    Ich möchte aber unbedingt zu dem Zeitpunkt an dem das Zeichen am Com-Port ankommt darauf reagieren, da ich die Zeitinformation benötige.

    Vielleicht kann mir jemand helfen.

    Gruß WhileBrecher



  • Haste mir mal irgendwo die Doku zu der API der Library? Dann kann ich dir vielleicht mal helfen ... Speziell zur Doku zur ComGetSetEventProc....

    -junix


Anmelden zum Antworten