AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Befehl in OnExecute ausführen

Ein Thema von Thorsten74 · begonnen am 25. Okt 2011 · letzter Beitrag vom 25. Okt 2011
Antwort Antwort
Thorsten74

Registriert seit: 25. Okt 2011
3 Beiträge
 
#1

Befehl in OnExecute ausführen

  Alt 25. Okt 2011, 09:39
Delphi-Version: 2009
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.931 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Befehl in OnExecute ausführen

  Alt 25. Okt 2011, 09:52
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).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Thorsten74

Registriert seit: 25. Okt 2011
3 Beiträge
 
#3

AW: Befehl in OnExecute ausführen

  Alt 25. Okt 2011, 10:04
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 ...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.931 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Befehl in OnExecute ausführen

  Alt 25. Okt 2011, 10:16
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);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: Befehl in OnExecute ausführen

  Alt 25. Okt 2011, 10:20
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.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Thorsten74

Registriert seit: 25. Okt 2011
3 Beiträge
 
#6

AW: Befehl in OnExecute ausführen

  Alt 25. Okt 2011, 12:09
Danke !

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

funktioniert !
  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 10:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf