Thread alle 5 Sekunden starten und beenden...

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

Moderator: Moderatoren

Antworten
Benutzeravatar
mini990
1000 working lines a day
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...

Beitrag 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
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

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

Beitrag von Werner_Bayern »

Servus Stefan,

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

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21150
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

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

Beitrag von Manfred »

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!!
Benutzeravatar
mini990
1000 working lines a day
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...

Beitrag von mini990 »

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: 9343
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 358 Mal
Kontaktdaten:

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

Beitrag 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.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21150
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

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

Beitrag 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.
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!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16488
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

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

Beitrag 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
: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
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21150
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

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

Beitrag von Manfred »

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!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9343
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 358 Mal
Kontaktdaten:

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

Beitrag von Tom »

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: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag 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
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

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

Beitrag 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
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: 9343
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 358 Mal
Kontaktdaten:

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

Beitrag 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.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21150
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

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

Beitrag 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?
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!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9343
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 358 Mal
Kontaktdaten:

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

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