system.timer() Kategorie: Programmierung (von Detlef - 30.12.2010 17:09) | ||
| ||
Hallo Zusammen, ich habe Probleme mit einem Thread, der den Systemtimer verwendet. Nach ca. 14 Tagen funktioniert er nicht mehr richtig, nach vier Wochen werden die Fehlfunktionen so gro�, da� ich einen Reset machen mu�. Grundsätzlich stehe ich mit der long Variable auf Kriegsfu�; obwohl ich mich meiner Meinung nach an die Spec halte, gibt es bei gro�en Zahlenwerten immer Probleme. Deshalb glaube ich auch, da� der gro�e Zahlenwert des system.timer() Ursache für die Probleme dieses Threads sind. Vielleicht erkennt ja einer von Euch sofort, was ich hier falsch mache. Anbei der Code. Grundsätzliche Funktion des Threads: Mehrere Funktionen nacheinander ausführen. Beispiel: Jalousien runterfahren und nach 20 Sekunden abschalten oder Licht aufziehen, nach einiger Zeit runterdimmen, dann nach weiterer Zeit ganz ausschalten. Aktwert[a] ist der Aktor, der gesteuert wird Aktwert[a+1] ist der Funtkionswert. Im Detail: 0-9 sind Funktionen rund um Jalousiesteuerung 10-19 sind Funktionen zur Relaissteuerung 20-29 sind Funktionen für Lichtdimmung. Aktwert[a+2] ist ein Parameter ( Wie weit sollen Jalousien fahren, wie hell das Dimmlicht usw.) Aktzeit ist die Zeit in ms, die vergehen soll, bis die Aktwert-Funktion erneut aufgerufen wird. Aktwert[a], Aktwert[a+1] und Aktwert[a+2] werden in einer anderen Funktion befüllt. Nach deren Befüllung wir das Aktflag auf 1 gesetzt, damit folgender Thread aktiv wird: thread Ueberwachung { int a,wert; long wart; // wart ist der Zeitpunkt wann reagiert werden soll. // Reagiert wird, sobald system.timer() grö�er wart wird. a=0; wait ((wart - system.timer()<=0) or Aktflag); // Solange wart-wert noch nicht erreicht. wart = system.timer()+3600000; // jede Stunde zumindest ein Lauf. Aktflag=0; // Interuptflag zurücknehmen. while Aktwert[a]!= ENDE // Schleife durchführen { if Aktwert[a] == LEER // Wenn Aktwert[a]==LEER und nächster Eintrag { // ist ENDE, wir das ENDE um einen Eintrag if Aktwert[a+3]==ENDE Aktwert[a]=ENDE; // vorgeholt. } else if (Aktzeit[a]-system.timer()) <= 0 // Ist diese Aktzeit überschritten? { if Aktwert[a+1] < 10 // Jalousien steuern { if Aktwert[a+1] == 0 // Modus 0 = Jalousie hoch bis Endschalter { dwmodule.JalAbs(JalZi[Aktwert[a]],Auf); // Jalousie hochfahren sleep 100; Aktzeit[a]=system.timer()+30000; // neue Aktzeit = 30 Sec Aktwert[a+1]=1; // Modus auf 1 hochsetzen } else if Aktwert[a+1] == 1 // Modus 1 = Jalousien runterfahren. { if Aktwert[a+2] dwmodule.JalAbs(JalZi[Aktwert[a]],Ab); // Jalousie runterfahren, wenn angegeben. sleep 100; // verhindert das Kleben der Relais if Aktwert[a+2] == 1 Aktzeit[a]=system.timer()+4000; // Jalousie viertel runterfahren else if Aktwert[a+2] == 2 Aktzeit[a]=system.timer()+8000; // Jalousie halb runter else if Aktwert[a+2] == 3 Aktzeit[a]=system.timer()+12000; // Jalousie ganz runter else if Aktwert[a+2] == 4 Aktzeit[a]=system.timer()+21000; // Jalousie ganz runter Aktwert[a+1]=2; // Modi auf 2 hochsetzen } else if Aktwert[a+1] == 2 // Jalousien stoppen { dwmodule.JalAbs(JalZi[Aktwert[a]],Stop); sleep 100; Aktwert[a]=LEER; // Auftrag aus Aktwert löschen. } } else if Aktwert[a+1] < 20 // Relais steuern { } else if Aktwert[a+1] < 30 // Dimmer steuern { } } if (wart-Aktzeit[a]) > 0 wart=Aktzeit[a]; // die kürzeste Wartzeit in wart eintragen a=a+3; // nächsten Aktwert Eintrag prüfen. } } | ||
Antwort schreiben Antworten: Re: system.timer() (von Wurl - 2.01.2011 21:32) Re: system.timer() (von nitraM - 4.01.2011 10:27) Re: system.timer() (von Detlef - 4.01.2011 11:35) Re: system.timer() (von nitraM - 5.01.2011 7:54) Re: system.timer() (von Wurl - 5.01.2011 10:48) Re: system.timer() (von Detlef - 5.01.2011 17:08) Re: system.timer() (von Wurl - 4.01.2011 21:41) Re: system.timer() (von Detlef - 4.01.2011 8:50) |