Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Befehl in OnExecute ausführen (https://www.delphipraxis.net/164004-befehl-onexecute-ausfuehren.html)

Thorsten74 25. Okt 2011 09:39

Delphi-Version: 2009

Befehl in OnExecute ausführen
 
Hallo Forum !

Ich habe hier schon seit einiger Zeit das Problem, dass ich in meinem Programm in der OnExecute Routine des Indy TCPServers verschiedene Befehle ausführen muss und dies immer zu Problemen führte.
Zwischenzeitlich hatte ich mir damit geholfen, in der OnExecute einen Timer zu starten und meine Befehle dann im OnTimer Event auszuführen, was natürlich sehr unschön und unsauber ist.
Ich vermute, dass es darin liegt, dass der Indy Server in einem eigenen Thread abläuft ???

Schon mal Danke
Thorsten

himitsu 25. Okt 2011 09:52

AW: Befehl in OnExecute ausführen
 
Jupp, das Ereignis läuft in seinem eigenen Thread.

Es kommt drauf an, was du in diesem Event alles machst.

Entweder du mußt dich mit dem gewünschten Thread synchronisieren (Delphi-Referenz durchsuchenSynchronize)
oder du sperrst gleichzeitige Zugriffe (Delphi-Referenz durchsuchenTCriticalSection).

Thorsten74 25. Okt 2011 10:04

AW: Befehl in OnExecute ausführen
 
Hallo himitsu.

Zur Erklärung:
Es handelt sich um eine Steuersoftware, die einen Controller steuert.
Die Steuerung für den Controller läuft über eine Active-X Komponente (MINT).

Nun beinhaltet meine Steuersoftware noch einen TCP-Server, über den andere Programme über ein einfaches ASCII Protokoll den Controller ansteuern können, ohne sich um Active-X, Überwachungen und Sonstiges kümmern zu müssen.

Befehle dieser Programme (eigener oder fremder Rechner) laufen also im OnExecute des TCP-Servers auf und sollen dort die entsprechenden Active-X Befehle generieren und ausführen.

Ich hoffe, das war verständlich.

Zum Synchronize:
Muss ich meine Active-X Steuerbefehle in eine Prozedur schreiben (so wie bisher in das OnTimer-Event) und diese über Synchronize aufrufen ?

Sorry, ich bin nur Gelegenheitsprogrammierer ...

himitsu 25. Okt 2011 10:16

AW: Befehl in OnExecute ausführen
 
Wenn die ActiveX-Komponente nicht threadsave ist, dann mußt du alle Zugriffe über den selben Thread laufen lassen.
Nutzt du diese Komponente auch innerhalb der VCL, dann muß also alles in den Hauptthread verlegt werden.

Synchronize synchronisiert sich ja standardmäßig mit dem Hauptthread.

Syncronize nimmt ja nunml eine parameterlose Methode entgegen.
Also ja, du müßtest diese Aufrufe in eine extra Methode auslagern.
Es sei denn du könntest/wölltest schon mit Generics arbeiten. (ich hoffe mal das lief im 2009er schon anständig)

Generics > als anonyme Methode:
Delphi-Quellcode:
Synchronize(nil, procedure
  begin
    //hier der Aufruf (man könnte sogar lokale Variablen/Parameter aus der aufrufenden Methode direkt verwenden)
  end);

Bummi 25. Okt 2011 10:20

AW: Befehl in OnExecute ausführen
 
Du könntest einen eigenen Workerthread aufsetzen dem die benötigten Informationen synchronized übergeben werden, dieser kann sie dann per Sync oder Queue von der Hauptanwendung abarbeiten lassen.

Thorsten74 25. Okt 2011 12:09

AW: Befehl in OnExecute ausführen
 
Danke !

TThread.Synchronize(nil,procedure
begin
Active_X;
end);

funktioniert !


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz