Seite 1 von 1

Thread alle 5 Sekunden starten und beenden...

Verfasst: Do, 06. Apr 2017 16:14
von mini990
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

Re: Thread alle 5 Sekunden starten und beenden...

Verfasst: Do, 06. Apr 2017 18:24
von Werner_Bayern
Servus Stefan,

SetTimerEvent() ist Dein Freund hierfür.

Re: Thread alle 5 Sekunden starten und beenden...

Verfasst: Do, 06. Apr 2017 19:42
von Manfred
aber nur wenn er nicht an anderer Stelle auch benutzt wird. Ansonsten kommst Du um einen eigenen Thread nicht umhin.

Re: Thread alle 5 Sekunden starten und beenden...

Verfasst: Fr, 07. Apr 2017 9:12
von mini990
Vielen Dank!
Der eine Eventtimer reicht für meine Zwecke....

Gruß Stefan

Re: Thread alle 5 Sekunden starten und beenden...

Verfasst: Fr, 07. Apr 2017 9:37
von Tom
aber nur wenn er nicht an anderer Stelle auch benutzt wird. Ansonsten kommst Du um einen eigenen Thread nicht umhin.
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.

Und das alles in einemTimerevent.

Jede Menge Threads zu sonstigen Zwecken gibt's natürlich trotzdem.

Re: Thread alle 5 Sekunden starten und beenden...

Verfasst: Fr, 07. Apr 2017 9:57
von Manfred
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.

Re: Thread alle 5 Sekunden starten und beenden...

Verfasst: Fr, 07. Apr 2017 10:16
von Martin Altmann
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

Re: Thread alle 5 Sekunden starten und beenden...

Verfasst: Fr, 07. Apr 2017 12:10
von Manfred
aha

Re: Thread alle 5 Sekunden starten und beenden...

Verfasst: Fr, 07. Apr 2017 13:01
von Tom
So in etwa. Einige Aufgaben werden, hiervon unabhängig, dann in eigenen Threads ausgeführt, aber das ist eine andere Sache.

Re: Thread alle 5 Sekunden starten und beenden...

Verfasst: Fr, 07. Apr 2017 13:07
von brandelh
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

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

Re: Thread alle 5 Sekunden starten und beenden...

Verfasst: Fr, 07. Apr 2017 13:13
von Jan
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

Re: Thread alle 5 Sekunden starten und beenden...

Verfasst: Fr, 07. Apr 2017 13:30
von Tom
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.

Re: Thread alle 5 Sekunden starten und beenden...

Verfasst: Fr, 07. Apr 2017 13:43
von Manfred
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?

Re: Thread alle 5 Sekunden starten und beenden...

Verfasst: Fr, 07. Apr 2017 14:24
von Tom
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.