Laden...

Timer & Co

Erstellt von Larsen vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.562 Views
L
Larsen Themenstarter:in
192 Beiträge seit 2006
vor 17 Jahren
Timer & Co

Hallo,
ich möchte folgendes machen:

Ich habe eine Funktion, die zyklisch von einem Timer aufgerufen wird. Innerhalb dieser Funktion ist der aufrufende Timer gestoppt. Nun möchte ich innerhalb dieser Funktion an einer Stelle eine zyklische Überprüfung (anderer Timer) einer Schnittstelle einbauen.

Jetzt habe ich festgestellt, wenn ich an der Stelle einen anderen Timer Starte komme ich nicht in die dementsprechende Tick Funktion wenn der Timer abgelaufen ist. Erst wenn die "Erste" Timerfunktion durchgelaufen ist komme ich dort hin.

Nun wäre es für mein Programm deutlich einfacher umzusetzen an dieser Stelle zu warten und zyklisch die Schnittstelle abzufragen ohne diese Funktion zu beenden.

So in der Art hatte ich das gedacht:


Timer1_Tick(){

   Timer2.Interval=500;

   Warte auf Timer2Tick
   Schnittsellenprüfung
   Wenn Prüfung noch nicht OK dann nochmals Timer2 aufziehen

}

Timer2Tick(){
 Aktiviere Prüfung
}

Ich hoffe das ist halbwegs verständlich!?
Hat jemand eine Idee wie man das machen kann?
Ich würde das Timerereignis auch pollen, weiß aber auch nicht ob und wie das geht.

Gruß
Larsen

...............Es gibt 10 Arten von Menschen ...............
die einen kennen binäre Zahlen, die anderen nicht!!!

B
1.529 Beiträge seit 2006
vor 17 Jahren

Deine Idee klingt irgendwie sehr ... verworren.

Gemeinhin löst man so etwas mit Synchronisation mehrerer Threads.
Bei dir klingt es allerdings so, als wenn du die Timer aus System.Windows.Forms nutzt. Diese sind dafür natürlich nicht zu verwenden.

Du hast einen Thread, der in einer Schleife an einem AutoResetEvent.WaitOne wartet.
Ein vom Timer zyklisch aufgerufener Thread prüft die Schnittstelle, falls die Prüfung erfolgreich ist, wird das AutoResetEvent signalisiert.
Der andere Thread setzt jetzt seine Arbeit fort. Wenn er sie fertig gestellt hat, beginnt der nächste Schleifendurchlauf wieder mit AutoResetEvent.WaitOne.

L
Larsen Themenstarter:in
192 Beiträge seit 2006
vor 17 Jahren

Sry dafür, dass das etwas verwirrend klingt,
ich denke aber, du hast das schon richtig interpretiert.
Ich nutze den Timer aus System.Windows.Forms. Die Bearbeitung mit unterschiedlichen
Threads habe ich offensichtlich noch nicht so ganz verstanden.

Zuerst brauchte ich auch nur einen Timer, der mir etwas zyklisch aufruft. Dass jetzt der zweite hinzukommt ist wie immer eine Erweiterung der Programmfunktionalität, an die im Vorfeld nicht gedacht wurde.

Ich nehme also mit :
Mit den System.Windows.Forms Timer geht das nicht sinnvoll!

Kann mir jemand ein Beispiel nennen oder erklären wie das mit der Thread synchronisation funktioniert.

Gruß
Larsen

...............Es gibt 10 Arten von Menschen ...............
die einen kennen binäre Zahlen, die anderen nicht!!!

B
1.529 Beiträge seit 2006
vor 17 Jahren
using System.Threading;
// wohlgemerkt: der Timer aus System.Threading
private Timer checkTimer = new Timer( new TimerCallback( CheckIt ), null, Timeout.Infinite, Timeout.Infinite );
private AutoResetEvent checkSuccess = new AutoResetEvent( false );
private bool doWatch;
private Thread doWatchThread = new Thread( new ThreadStart( DoWhatever ) );

public void StartWatch()
{
   doWatch = true;
   doWatchThread.Start();
   checkTimer.Change( 500, Timeout.Infinite );
}

public void StopPortWatch()
{
   doWatch = false;
   checkTimer.Change( Timeout.Infinite, Timeout.Infinite );
   checkSuccess.Set();
   doWatchThread.Join();
}

public void CheckIt( object state )
{
   // Schnittstelle prüfen
   if (Schnittstelle bereit)
   {
      checkSuccess.Set();
   }
   if (doWatch)
   {
      checkTimer.Change( 500, Timeout.Infinite );
   }
}

public void DoWhatever()
{
   while(doWatch)
   {
      checkSuccess.WaitOne();
      if (doWatch)
      {
         // Port abfragen und was auch immer
      }
   }
}

EDIT: Code überarbeitet.

L
Larsen Themenstarter:in
192 Beiträge seit 2006
vor 17 Jahren

DANKE für den Codevorschlag.
Ganz verstehen tue ich ihn noch nicht aber das kriege ich schon hin 🙂

Ich hab schon mal ein bischen nachgelesen was man so machen kann, da öffnen sich für einen Anfänger Welten, an die habe ich bis jetzt nicht einmal gedacht!!!

Also, ich acker mich mal da rein.

Gruß
Larsen

...............Es gibt 10 Arten von Menschen ...............
die einen kennen binäre Zahlen, die anderen nicht!!!

L
Larsen Themenstarter:in
192 Beiträge seit 2006
vor 17 Jahren

Hallo,
ich habe mich schon mal ein bischen eingelesen und habe mittlerweile gelernt, dass meine momentane Lösung sehr schlecht ist.


...
Form MyForm = new Form();
bool bEnde = false;
int Cnt=3000;
MyForm.Show();

while ( bEnde ==false && Cnt >0 && MyForm.Visible == true){
  Thread.Sleep(100);
  bEnde =Schnittstelleabfrage();
  Cnt-=100;
}
MyForm.Dispose();

Das soll bewirken, dass meine Schnittstellenabfrage maximal drei Sekunden läuft oder durch das Beenden des Forms unterbrochen wird oder wenn Schnittstellenabfrage false zurück gibt.

leider mußte ich feststellen, dass ich keinen wirklichen Zugriff auf das Form habe. Liegt das daran, das ich das aus dem thread aufrufe, der meistens schläft?
Muß ich das UserForm aus einem sepearten thread aufrufen, den ich vorher starte?

Ich habe auch was über delegate gelesen, sollte man lieber damit arbeiten als direkt mit unterschiedlichen threads?

Über die Sleep(100) wollte ich eine Zeiteinstellung vornehmen, habe aber das Gefühl es laüft schneller. Kann das sein?
Also: bei Cnt=3000und Sleep(100) und Cnt-=100;
dachte ich kommt genau 3Sec heraus. Ich hab aber das Gefühl es ist schneller.

Ich denke ich brauche keine ganaue Anleitung, nur einen Wink in die richtige Richtung den Rest lese ich mir dann an.

Ich hoffe aus dem Codeschnipsel ist halbwegs klar was ich machen möchte.
Nochmal in Worten:
Ich habe eine Funktion die etwas länger auf ein Ereignis wartet, während ich warte will ich auf einem UserForm die restliche Wartezeit darstellen (Cnt). Das Warten soll aber auch abgebrochen werden, wenn ich das UserForm ausblende (visible=false).
Wie bekomme ich das hin, das ich mit dem UserForm arbeiten kann?

...............Es gibt 10 Arten von Menschen ...............
die einen kennen binäre Zahlen, die anderen nicht!!!