progamm bleibt stehen, wenn formular angeklickt wird...

tycomatze

Level-1
Beiträge
27
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
ich hab in delphi 5 ein programm geschrieben, dass prinzipell gesehen folgendes ausführt:

wenn button gedruckt wird, dann aktiviere den clientsocket.
wenn clientsocket connected, dann sende befehl zur datenübermittlung
wenn clientsocket daten empfängt, dann werte empfangene daten aus und sende erneut befehl zur datenübermittlung.

das ganz läuft also zyklisch ab, das funktioniert auch einwandfrei, solang man nicht den formularkopf (wo die Bezeichung der Formulars drin steht) anklickt oder eben versucht das fenster zu verschieben, dann bleibt das programm für einen kurzen moment "stehen" und die zyklische abarbeitung wird somit nicht weiter ausgeführt.
ich habe keinerlei ereignisse für das formular programmiert und kann mir nicht erklären woher das kommt. falls das normal ist, gibts denn da eine möglichkeit das zu unterdrücken?
danke
 
ich habe keinerlei ereignisse für das formular programmiert und kann mir nicht erklären woher das kommt. falls das normal ist, gibts denn da eine möglichkeit das zu unterdrücken?
danke
Ich gehe mal davon aus, daß du die Daten im Event einer TClientSocket-Komponente entgegennimmst, die Du auf das Formular gezogen hast. Damit erfolgt die Abarbeitung im Main-Thread Deiner Anwendung. Im gleichen Thread werden von Delphi auch die Windows-Botschaften beim Verschieben des Fensters verarbeitet. Dadurch kommt es zu der Verzögerung in Deinem Ablauf.

Pack die Kommunikation in einen eigenen Thread, in dem Du dann die Instanz vom TClientSocket im Programmcode erzeugst (ein Thread hat kein Formular). Falls Du im Event von TClientSocket Daten in VCL-Komponenten schreibst, mußt Du aufpassen, weil viele VCL-Komponenten (vor allem die visuellen) nicht threadsafe sind !


Gruß Axel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Synchronize

Hallo,

weil viele VCL-Komponenten (vor allem die visuellen) nicht threadsafe sind !

Nicht nur viele VCL-Komponenten, sondern alle VCL-Komps in der Applikation. Dafür gibt es die Methode "Synchronize", aber eine Parameterübergabe von einem Thread zum Hauptprogramm ist nicht möglich. Eigentlich auch logisch, man muss halt selber dafür sorgen, dass alles threadsafe ist.

Gruß

Question_mark
 
Nicht nur viele VCL-Komponenten, sondern alle VCL-Komps in der Applikation.
So die offiziellen Angaben, aber mit einigen Eigenschaften von der einen oder anderen Komponente habe ich schon die Erfahrung gemacht, daß man sie auch aus anderen Threads heraus beschreiben kann. Im Zweifelsfalle muß man einfach mal einen Blick in den Quellcode der Komponente werfen (sofern man den hat :p).

Dafür gibt es die Methode "Synchronize", aber eine Parameterübergabe von einem Thread zum Hauptprogramm ist nicht möglich.
Der Synchronize-Methode kann man zwar beim Aufruf keine Parameter für den Aufruf im Main-Thread mitgeben, eine Parameter-Übergabe läßt sich aber ganz einfach über private Felder im eigenen TThread-Nachfolger realisieren. ;)

Eigentlich auch logisch, man muss halt selber dafür sorgen, dass alles threadsafe ist.
So isses ... :ROFLMAO:


Gruß Axel
 
Zurück
Oben