AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Was passiert, wenn ein Event schnell hintereinander feuert?

Was passiert, wenn ein Event schnell hintereinander feuert?

Ein Thema von Jumpy · begonnen am 30. Nov 2011 · letzter Beitrag vom 30. Nov 2011
Antwort Antwort
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.709 Beiträge
 
Delphi 6 Enterprise
 
#1

Was passiert, wenn ein Event schnell hintereinander feuert?

  Alt 30. Nov 2011, 07:24
Hallo DP,

wie ist das, wenn ein Event oft und schnell hintereinander feuert, sprich das Event feuert schon wieder, noch bevor das erste komplett abgearbeitet ist. Kann da was veloren gehen?

Wäre es sinnvoll, das Abarbeiten des Events einem Thread zu übergeben, so dass die Hauptanwendung den nächsten Event empfangen kann?
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Was passiert, wenn ein Event schnell hintereinander feuert?

  Alt 30. Nov 2011, 07:40
Von was für einem Event reden wir hier?

Ein Event, den die eigene Anwendung produziert, oder der durch eine Message ausgelöst wird?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.709 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: Was passiert, wenn ein Event schnell hintereinander feuert?

  Alt 30. Nov 2011, 08:15
Von was für einem Event reden wir hier?

Ein Event, den die eigene Anwendung produziert, oder der durch eine Message ausgelöst wird?
Ich glaube: Ein Event, den die eigene Anwendung produziert, aber als Reaktion auf etwas von aussen?

Ich habe eine IdhttpServer-Komponente in der Anwendung, die auf IdHTTPServer1CommandGet reagiert.

Die Anfrage selber kommt halt von einer Fremdsoftware über http, wobei mittels GET Request Parameter übergeben werden (und diese will ich analysieren und ggf. verwursten).

Und weil ich gerade diesen aktuellen Thread hier lese. Wenn ich das in Threads mache, könnten ja u.U. mehrere Threads gleichzeitig arbeiten, weil gerade mehrere Events schnell hintereinander kamen. Innerhalb der Threads würde ich gerne eine DB-Abfrage machen und auch ein Logging betreiben, entweder in eine Datei oder in eine separate DB-Tabelle. Das wäre aber auf jeden Fall etwas, wo sich die Threads Ressourcen teilen würden, und ich aufpassen muss, oder?
Am liebsten würde ich nämlich auch nur eine DB-Connection aufbauen, die dann (von den Threads) für alle Querys genutzt wird. Das wäre dann aber wahrsch. wieder ein Flaschenhals, so dass die Frage ist, ob dann Threads noch Sinn machen.

Hängt wohl an der Grundfrage: Können Events verloren gehen?
Ralph
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.659 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: Was passiert, wenn ein Event schnell hintereinander feuert?

  Alt 30. Nov 2011, 08:32
Events durch Messages ja, da die Messagequeue irgendwann so voll wird, dass nach gewissen Prioritäten verworfen wird.

Bei Callbacks, die Event-Mäßig implementiert sind nein, da sie synchron ablaufen, und den Aufrufer so lange blockieren, bis die Verarbeitung abgeschlossen ist. (Da könnte höchstens der Aufrufer so witzig werden, und den Aufruf in einem Thread machen, der mit einem Timeout- bzw. Loadhandling dafür sorgt, dass die Callbacks reduziert werden.)

Für deinen Fall klingt ein Worker-Threadpool sinnvoll (gabs auch ein nettes Framework hier in der DP zu meine ich), nur sollte auf jeden Fall jeder Thread seine eigene DB-Connection erhalten. Die DB selbst kommt dank ihrer internen Locking-Mechanismen prima klar mit gleichzeitigen Zugriffen aus mehreren Threads (dafür wuden DBMS u.a. schließlich gebaut ). Beim Logging in eine Datei, müsstest du selber sicherstellen, dass immer nur ein Thread da rein fummelt, was mit einer CriticalSection aber auch recht simpel ist.

Fazit: Wenn du unsicher bist, wie dein Aufrufer sich bei längerer Blockierung verhält, und/oder Fenster-Messages mitspielen, wäre eine threadbasierte Lösung keine schlechte Idee.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
schlecki

Registriert seit: 11. Apr 2005
Ort: Darmstadt
148 Beiträge
 
Delphi XE2 Enterprise
 
#5

AW: Was passiert, wenn ein Event schnell hintereinander feuert?

  Alt 30. Nov 2011, 09:02
Bekommt man bei den Indys nicht jede Anfrage in einem eigenen Thread? Zumindest bei den FTP-Komponenten ist das so.
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.709 Beiträge
 
Delphi 6 Enterprise
 
#6

AW: Was passiert, wenn ein Event schnell hintereinander feuert?

  Alt 30. Nov 2011, 16:04
Ich denke, ich werde das Thread basiert lösen und logging via DB, da ich mir dann um die Zugriffe keinen Kopf machen muss.

Welchen Sinn/Funktion hat dann der erwähnte Worker-Threadpool (hat die Wiederverwendung von Threads gegenüber der Neuerzeugung Vorteile?)?

Ich hätte jetzt naiv einen Thread erzeugt, der sein Ding macht und danach friedlich stirbt. Für jedes weitere Event ein neuer Thread.

P.S.: Geben Threads sich eigentlich selber wieder frei, wenn sie sterben?
Ralph
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.657 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Was passiert, wenn ein Event schnell hintereinander feuert?

  Alt 30. Nov 2011, 16:06

P.S.: Geben Threads sich eigentlich selber wieder frei, wenn sie sterben?
.. wenn freeOnTerminate wahr ist, dann schon.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
457 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Was passiert, wenn ein Event schnell hintereinander feuert?

  Alt 30. Nov 2011, 16:31
Welchen Sinn/Funktion hat dann der erwähnte Worker-Threadpool (hat die Wiederverwendung von Threads gegenüber der Neuerzeugung Vorteile?)?

Ich hätte jetzt naiv einen Thread erzeugt, der sein Ding macht und danach friedlich stirbt. Für jedes weitere Event ein neuer Thread.
Zum Beispiel weil Du dann NULL Einfluss/Ahnung hast wie viele Threads erzeugt werden.
Wenn Du das mehrmals in Deiner Applikation machst und/oder dies auch Andere gleichzeitig tun
ist das Betriebssystem nur noch mit verwalten von Rechnerzeit beschäftigt.

Dies gibt dann so schöne Effekte dass sich der Rechner anfühlt wie ein 486-er.
Der Blick auf den Taskmanager gibt auf den ersten Blick auch nichts her.
Wenn dann aber im ProcessExplorer in einem Service > 1000 Threads sichtbar macht
sind die Fragen beseitigt.
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf