Thread alle 5 Sekunden starten und beenden...
Moderator: Moderatoren
- mini990
- 1000 working lines a day
- Beiträge: 592
- Registriert: Sa, 28. Jan 2006 9:44
- Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
- Danksagung erhalten: 1 Mal
Thread alle 5 Sekunden starten und beenden...
Hallo,
hoffe dieser Thread ist der richtige.
Gibt es Beispiele o.ä. wie man folgendes umsetzen kann?
"Schaue alle XX Sekunden nach ob die Datei sowieso Inhalt hat"
...und zwar unabhängig wo man sich gerade im Programm befindet?
In Clipper-Zeiten habe ich das über Inkey() gelöst...
Gruß Stefan
hoffe dieser Thread ist der richtige.
Gibt es Beispiele o.ä. wie man folgendes umsetzen kann?
"Schaue alle XX Sekunden nach ob die Datei sowieso Inhalt hat"
...und zwar unabhängig wo man sich gerade im Programm befindet?
In Clipper-Zeiten habe ich das über Inkey() gelöst...
Gruß Stefan
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2126
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Thread alle 5 Sekunden starten und beenden...
Servus Stefan,
SetTimerEvent() ist Dein Freund hierfür.
SetTimerEvent() ist Dein Freund hierfür.
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- Manfred
- Foren-Administrator
- Beiträge: 21211
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: Thread alle 5 Sekunden starten und beenden...
aber nur wenn er nicht an anderer Stelle auch benutzt wird. Ansonsten kommst Du um einen eigenen Thread nicht umhin.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- mini990
- 1000 working lines a day
- Beiträge: 592
- Registriert: Sa, 28. Jan 2006 9:44
- Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
- Danksagung erhalten: 1 Mal
Re: Thread alle 5 Sekunden starten und beenden...
Vielen Dank!
Der eine Eventtimer reicht für meine Zwecke....
Gruß Stefan
Der eine Eventtimer reicht für meine Zwecke....
Gruß Stefan
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9387
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 103 Mal
- Danksagung erhalten: 362 Mal
- Kontaktdaten:
Re: Thread alle 5 Sekunden starten und beenden...
Na ja, man kann in die Funktion, die der Codeblock u.U. aufruft, schon eine ganze Menge hineinpacken. Ich habe ein "zentrales" Timerevent, das alle dreißig Sekunden ein Logout/Login beim Dongle auslöst, alle 10 Sekunden auf diverse Semaphoren prüft, mehrere Tabellen auf Ergänzungen überwacht und bei Bedarf den Server anpingt. Außerdem sind diverse Synchronisationsroutinen mit Fremdsystemen eingebettet (Datenabgleich mit Kontaktmanagementsystemen, Versorgung von Benchmarkdatenbanken usw.) und in der Standard-Tabellen-Version (also ohne Datenbankserver) wird auch noch die "Anwesenheitstabelle" aktualisiert, so dass jeder sehen kann, wer wo eingeloggt ist. Außerdem wird mit einem hauseigenen Messenger-Server synchronisiert.aber nur wenn er nicht an anderer Stelle auch benutzt wird. Ansonsten kommst Du um einen eigenen Thread nicht umhin.
Und das alles in einemTimerevent.
Jede Menge Threads zu sonstigen Zwecken gibt's natürlich trotzdem.
Herzlich,
Tom
Tom
- Manfred
- Foren-Administrator
- Beiträge: 21211
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: Thread alle 5 Sekunden starten und beenden...
hm, haben die alle den gleichen Zeitabstand? Dann wäre das ok. Aber wie sieht es aus, wenn alle oder mehrere verschiedene Zeitabläufe hätten? Das Problem hatte ich nämlich und deshalb habe ich mich für einzelne Threads entschieden. Würde aber gerne noch dazulernen, wenn diese Entscheidung nicht unbedingt notwendig war.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Martin Altmann
- Foren-Administrator
- Beiträge: 16536
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 113 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Thread alle 5 Sekunden starten und beenden...
Manfred,
das ist doch kein Problem - Du nimmst den kleinsten, gemeinsamen Nenner und eine static-Variable.
In Toms Fall: 10 Sekunden ist das Intervall - ein Teil soll alle dreißig Sekunden ablaufen (also jeden dritten Aufruf). Die static wird bei jedem Aufruf hochgezählt, bei drei wieder initialisiert und der seltenere Teil ausgeführt.
Viele Grüße,
Martin
das ist doch kein Problem - Du nimmst den kleinsten, gemeinsamen Nenner und eine static-Variable.
In Toms Fall: 10 Sekunden ist das Intervall - ein Teil soll alle dreißig Sekunden ablaufen (also jeden dritten Aufruf). Die static wird bei jedem Aufruf hochgezählt, bei drei wieder initialisiert und der seltenere Teil ausgeführt.
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- Manfred
- Foren-Administrator
- Beiträge: 21211
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: Thread alle 5 Sekunden starten und beenden...
aha
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9387
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 103 Mal
- Danksagung erhalten: 362 Mal
- Kontaktdaten:
Re: Thread alle 5 Sekunden starten und beenden...
So in etwa. Einige Aufgaben werden, hiervon unabhängig, dann in eigenen Threads ausgeführt, aber das ist eine andere Sache.
Herzlich,
Tom
Tom
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Thread alle 5 Sekunden starten und beenden...
Ein Thread, der alle 5 Sekunden starten soll, birgt grundsätzlich die Gefahr, dass die Verarbeitung länger dauert !
Je nach Aufgabe und benötigten Resourcen hat man sich dann schnell selbst blockiert ... denn er startet obwohl er noch läuft.
Ich würde jede Aufgabe mit einer Funktion abarbeiten, ohne Thread diese debuggen und testen und dann einen Thread spendieren.
Alle Aktionen die nötig werden dann in die normale Eventloop setzen und den Thread frei geben. Damit nicht unnötig Zeit vergeudet wird, hilft ein sleep(10) in der Schleife.
Beispiel
... Test
Je nach Aufgabe und benötigten Resourcen hat man sich dann schnell selbst blockiert ... denn er startet obwohl er noch läuft.
Ich würde jede Aufgabe mit einer Funktion abarbeiten, ohne Thread diese debuggen und testen und dann einen Thread spendieren.
Alle Aktionen die nötig werden dann in die normale Eventloop setzen und den Thread frei geben. Damit nicht unnötig Zeit vergeudet wird, hilft ein sleep(10) in der Schleife.
Beispiel
Code: Alles auswählen
function Test(lKill) // lKill per Referenz aus dem Hauptprogramm zur Verfügung stellen
local nLastStart := 0, nWarteZeit := 5
do while ! lKill
if nLastStart + nWarteZeit >= 86400 // Mitternacht
nLastStart := 0
endif
if nLastStart + nWerteZeit >= Seconds()
if Teste() ...
PostAppEvent(...) oder Erledige aber schnell !
endif
nLastStart := Seconds()
endif
sleep(10) // Test alle 0,1 Sek - oder auch 0,5 etc. je nach nWarteZeit
enddo
return nil
... Test
Gruß
Hubert
Hubert
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Thread alle 5 Sekunden starten und beenden...
Hallo Hubert,
ansich arbeite ich auch gerne mit Intervallen im Thread. Aber auch ich habe schon erlebt, das der sich dann schon mal selber überholt hat. Etwas kontraproduktiv. ich konnte da zum Glück einfach den Intervall vergrößern. Was nicht immer geht.
In solchen kritischen Fällen mache ich das dann ähnlich wie Du. Das hat aber einen Nachteil: Wenn es wirklich auf die Abstände oder Zeitpunkte ankommt, klappt das damit natürlich nicht. Weil sich die Ausführung ja immer um die Ausführungsdauer verlängert. Da steckt man dann in der Bredouille - exakte Abstände, oder nicht überholen lassen?
Die Idee von Tom finde ich interessant für die Fälle, wo relativ viel in Intervallen erledigt werden soll. Man hat das dann alles gut geordnet und komprimierter auf einem Stapel. Ich selber hatte aber bislang noch nicht die Situation, wo das besser gepasst hätte als die ein oder zwei Threads, die ich da benöigt hatte.
Jan
ansich arbeite ich auch gerne mit Intervallen im Thread. Aber auch ich habe schon erlebt, das der sich dann schon mal selber überholt hat. Etwas kontraproduktiv. ich konnte da zum Glück einfach den Intervall vergrößern. Was nicht immer geht.
In solchen kritischen Fällen mache ich das dann ähnlich wie Du. Das hat aber einen Nachteil: Wenn es wirklich auf die Abstände oder Zeitpunkte ankommt, klappt das damit natürlich nicht. Weil sich die Ausführung ja immer um die Ausführungsdauer verlängert. Da steckt man dann in der Bredouille - exakte Abstände, oder nicht überholen lassen?
Die Idee von Tom finde ich interessant für die Fälle, wo relativ viel in Intervallen erledigt werden soll. Man hat das dann alles gut geordnet und komprimierter auf einem Stapel. Ich selber hatte aber bislang noch nicht die Situation, wo das besser gepasst hätte als die ein oder zwei Threads, die ich da benöigt hatte.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9387
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 103 Mal
- Danksagung erhalten: 362 Mal
- Kontaktdaten:
Re: Thread alle 5 Sekunden starten und beenden...
Ich würde in einem solchen Thread natürlich keine Aufgabe auslösen - jedenfalls nicht im Rahmen einer sequentiellen Abarbeitung -, die große Datenmengen crunchen soll oder ähnliches. Es wird je Intervall geprüft, welche Aufgaben auszulösen sind (alle 5 Sekunden: A, C, D, alle 10 Sekunden: A, C, D, F, alle 30 Sekunden: A, B, C, D, F, einmal pro Minute: A, B, C, D, E, F), und dann werden sie eben anschließend ausgelöst. Nichts davon dauert auch nur annähernd so lange, dass es dazu führen könnte, dass das nächste Intervall - 5 Sekunden - übersprungen wird, aber selbst wenn - die Auslösung würde dann eben nach 6 oder 7 Sekunden erfolgen, auch kein Problem. Es werden ja Abstände gemessen, nicht exakte Intervalle. Außerdem könnte einem das auch in getrennten Threads passieren.
Herzlich,
Tom
Tom
- Manfred
- Foren-Administrator
- Beiträge: 21211
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: Thread alle 5 Sekunden starten und beenden...
also würdest Du jeweils einen Thread starten, der dann nach Ablauf der Zeit jeweils im Hintergund läuft, aber die Prüfung der Zeitabstände überläßt Du dem SetTimerEvent()? So würde dann die Intervallprüfung immer im Rahmen bleiben, aber die Ausführung im Hintergrund laufen und nichts weiter beeinflussen? Oder wie darf ich das verstehen?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9387
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 103 Mal
- Danksagung erhalten: 362 Mal
- Kontaktdaten:
Re: Thread alle 5 Sekunden starten und beenden...
Es gibt z.B. ein sehr umfangreiches Servicelog, das einmal am Tag erzeugt wird, und dieser Prozess läuft natürlich in einem eigenen Thread ab, wird aber im zentralen Timer ausgelöst. Dieser und ähnliche Vorgänge (Wartungsprozesse, umfangreiche Datensynchronisationen, im Hintergrund erzeugte Statistiken usw.) sind ja auch selten so getaktet, dass sie sich selbst im Weg stehen könnten, weil man sie nur einmal am Tag braucht (oder seltener). Was man häufig(er) prüft, das sind eben Semaphoren, Transfertabellen, irgendwelche Nachrichtensachen usw., und nichts davon dauert länger als ein paar Sekundenbruchteile. Umgekehrt habe zumindest ich keinen Prozess, der unbedingt exakt um 5 Sekunden nach irgendwas ausgelöst werden muss. Sechs Sekunden nach ist im Prinzip auch in Ordnung. Passiert aber so gut wie nie.
Hätte ich allerdings einen Prozess, der alle 10 Sekunden ausgelöst werden muss, aber länger als zehn Sekunden dauern kann, würde ich mir die Frage stellen, ob es Sinn hat, ihn mehrfach gleichzeitig auszulösen. Wahrscheinlich eher nicht. Ich würde aber trotzdem nicht den Thread zwischen zwei Auslösungen schlafen legen, sondern jeweils neu initiieren.
Hätte ich allerdings einen Prozess, der alle 10 Sekunden ausgelöst werden muss, aber länger als zehn Sekunden dauern kann, würde ich mir die Frage stellen, ob es Sinn hat, ihn mehrfach gleichzeitig auszulösen. Wahrscheinlich eher nicht. Ich würde aber trotzdem nicht den Thread zwischen zwei Auslösungen schlafen legen, sondern jeweils neu initiieren.
Herzlich,
Tom
Tom