Indy + Threadverarbeitung
-
Hallo Leute,
Ich habe ein Programm in dem ich die Komponenten ServerSocket und Clientsocket
ersetzen will, da diese ja seit ein paar Jahren nicht mehr gepflegt werden.
Ich will sie mit IndyKomponenten ersetzen.
Damit ich die Verarbeitung nicht umstellen muss, habe ich beim Client einen Thread erstellt, der dauernd frägt ob ihm der Server eine Nachricht geschickt hat.
Auf Grund der Nachricht, stelle ich Verarbeitungen an, und schicke neue Anfragen ect.Das mit dem Synchronize will bei mir nicht funktionieren.
Und auch ohne Synchronize funktioniert bei weitem nicht alles, bzw. sehr langsam, oder gar nicht....Mein Thread
__fastcall NachrichtEmpfangen::NachrichtEmpfangen(bool CreateSuspended) : TThread(CreateSuspended) { FreeOnTerminate = true; SatzAnf = SATZANF; //StringTrennerZeichen def. in Unit1.h SatzTre = SATZTRE; SatzEnd = SATZEND; } //--------------------------------------------------------------------------- void __fastcall NachrichtEmpfangen::Execute() { //---- Thread-Code hier einfügen ---- while (!Terminated) { try { //Msg Holen! //Synchronize(&GuiElements); // Hier hängt sich das Programm meistens auf GuiElements(); } catch (...) { } } } //--------------------------------------------------------------------------- void __fastcall NachrichtEmpfangen::GuiElements() { if (!Form1->IdTCPClient1->IOHandler->RecvBufferSize > 0) return; Nachricht = Form1->IdTCPClient1->IOHandler->ReadLn(); if(Nachricht.Length()) Form1->NachrichtVerarbeiten(Nachricht); }
In der Methode Nachricht Verarbeiten mache ich dann so Sachen wie den String zerlegen, und damit ListViews füllen oder Labels ect.
Hat von euch schon jemand ServerSocket ersetzt?!
Oder einen IndyClient mit Thread erfolgreich programmiert?!
Ist es besser ich stell die Verarbeitung um, so das der Client immer eine Nachricht schickt und erst weiter macht wenn er die Antwort hat?
Also eine synchrone Verarbeitung. Bisher wars halt ne ASynchrone?!Mfg Alex
-
Keiner eine Hilfe für mich?!
Hab nun meinen eignen Thread mit der Komponente
IdThreadComponent
ersetzt da es heißt dieser ist schneller?!
Jedoch habe ich die gleichen Probleme wie zuvor.
-
Arbeitet die Methode 'ReadLn()' denn blockierend? Dann wäre es ja kein Wunder, daß dein Programm an der Stelle steht.
Du solltest nur den Zugriff auf direkte GUI-Elemente mittels "Snychronize" sychronisieren. Dafür wäre es besser, wenn du die Indy-Komponente in ein DataModule packst (d.h. nicht auf eine Form).
-
Th69 schrieb:
Arbeitet die Methode 'ReadLn()' denn blockierend? Dann wäre es ja kein Wunder, daß dein Programm an der Stelle steht.
Du solltest nur den Zugriff auf direkte GUI-Elemente mittels "Snychronize" sychronisieren. Dafür wäre es besser, wenn du die Indy-Komponente in ein DataModule packst (d.h. nicht auf eine Form).
jop die Indys arbeiten blockend
-
das heißt ich sollte die Kommunikation umstellen von asynchron auf synchron?!
-
Wieso unbedingt Indy?
Die Implementationen mit WINAPI Threads und der winsock.h sind wesentlich zuverlässiger.