Einzelnen Beitrag anzeigen

mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Indy 10 TCPServer-Synchronize

  Alt 18. Jun 2012, 18:51
Wo ist denn der TIdThread geblieben mit dem man bei IdTCPServer im OnExecute Ereignis mit dem Hauptthread-Synchronisieren konnte. Irgendwie finde ich im Moment keine einfache Möglichkeit, wie ich im OnExecute ein Synchronize machen kann. Bei Indy 9 war das noch ganz leicht AThread.Synchronize(methode). Aber bei Indy 10 wird jetzt ein TIdContext übergeben. Und das bietet keinen Zugang zum "Vater"-Thread.
Hat das vielleicht jemand herausgefunden, wie das geht? Oder stelle ich mich heute nur blöd an und die Lösung ist ganz einfach?
Was ist der Vater-Thread, der Hauptthread der Anwendung oder der aktuell laufende Thread in dem OnExecute ausgeführt wird?

Falls Hauptthread der Anwendung gemeint ist:

* handelt es sich um eine GUI Anwendung (Server mit Benutzeroberfläche)? Dann könnte man synchronized verwenden (aber wahrscheinlich ist eine threadsichere Queue oder die Verwendung von Events oder IdNotify zur Kommunikation besser, da synchronized nicht mehr funktionieren wird wenn aus der GUI Anwendung eine Konsolen- oder Serviceanwendung gemacht wird)

* andernfalls (Konsolen- oder Serviceanwendung) muss man den Austausch mit dem Hauptthread anders lösen, zum Beispiel kann man Nachrichten in eine threadsichere Queue schreiben die dann aus anderen Threads gelesen wird

Falls der aktuell ausgeführte Thread des OnExecute gemeint ist: es kann mehr als einen geben!

* ab Indy 10 kann es sein, das eine einzige Verbindung zu verschiedenen Zeitpunkten von verschiedenen Threads behandelt wird, zum Beispiel kann der TCPServer das OnConnect der Verbindung von einem anderen Thread aus aufrufen als das erste OnExecute, und das nächste OnExecute wieder von einem anderen Thread. (Verwendung eines Threadpools).

Code:
"The events are still executing in a thread. In Indy 9, each connection was assigned to one thread. In Indy 10 in some cases it is possible that a single connection will be handled at different times by different threads. For example, the OnConnect may be called from on thread, the OnExecute from another, and the OnExecute yet another."
Michael Justin
habarisoft.com

Geändert von mjustin (18. Jun 2012 um 19:14 Uhr)
  Mit Zitat antworten Zitat