Thread alle 5 Sekunden starten und beenden...

Auf dem Weg von Clipper, FoxPro u.ä. nach Xbase++

Moderator: Moderatoren

Antworten
Benutzeravatar
mini990
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 494
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.

Thread alle 5 Sekunden starten und beenden...

Beitrag von mini990 » Do, 06. Apr 2017 16:14

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

Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1542
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

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

Beitrag von Werner_Bayern » Do, 06. Apr 2017 18:24

Servus Stefan,

SetTimerEvent() ist Dein Freund hierfür.
es grüßt euch

Werner

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 18048
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

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

Beitrag von Manfred » Do, 06. Apr 2017 19:42

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 Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite

Benutzeravatar
mini990
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 494
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.

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

Beitrag von mini990 » Fr, 07. Apr 2017 9:12

Vielen Dank!
Der eine Eventtimer reicht für meine Zwecke....

Gruß Stefan

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7290
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

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

Beitrag von Tom » Fr, 07. Apr 2017 9:37

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.
Herzlich,
Tom

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 18048
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

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

Beitrag von Manfred » Fr, 07. Apr 2017 9:57

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 Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 14503
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

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

Beitrag von Martin Altmann » Fr, 07. Apr 2017 10:16

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
:grommit:
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
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 18048
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

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

Beitrag von Manfred » Fr, 07. Apr 2017 12:10

aha
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7290
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

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

Beitrag von Tom » Fr, 07. Apr 2017 13:01

So in etwa. Einige Aufgaben werden, hiervon unabhängig, dann in eigenen Threads ausgeführt, aber das ist eine andere Sache.
Herzlich,
Tom

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14549
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

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

Beitrag von brandelh » Fr, 07. Apr 2017 13:07

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
Gruß
Hubert

Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 13083
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

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

Beitrag von Jan » Fr, 07. Apr 2017 13:13

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7290
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

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

Beitrag von Tom » Fr, 07. Apr 2017 13:30

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

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 18048
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

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

Beitrag von Manfred » Fr, 07. Apr 2017 13:43

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 Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7290
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

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

Beitrag von Tom » Fr, 07. Apr 2017 14:24

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.
Herzlich,
Tom

Antworten