TThread und TSocket / Klasse im Thread?
-
Hi
Ich habe einen TThread und möchte darin einen Socket laufen lassen.
Nen Thread mit mit Socket habe ich auch hinbekommen aber dieser behindert im onClientRead den VCLThread!
Woran liegt das?
Kann ich in einem TThread auch eine eigene Klasse mit Socket, etc anlegen (imKonstrutor)?
und muss die Execute immer laufen egal was ich mache? kann ich es nicht machen das der so läuft?habe auser dem reagieren auf erreignisse nichts, was der Thread machen müsste!Hoffe ihr versteht mich und könnt mir helfen!
THX
Daya
-
Weil der socket vermutlich auf irgend me message reagiert... und da ein TThread keine Message-Queue hat...
-junix
-
Achso sowas in der richtung habe habe ich mir schon gedacht!
gibt es da einen weg das irgentwie zu umgehen?
also das ereignisse in einem anderen Thread ausgeführt werden!THX
dagsta
-
Hier mal der code:
Kann man da den nichts machen? nen eigenen ereignisshändlermachen oderso? muss ja nur auf onClientRead, onConnect und onDisconnect reagieren!//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "TUploads.h" #include "StartU.h" #pragma package(smart_init) //--------------------------------------------------------------------------- // Wichtig: Methoden und Eigenschaften von Objekten der VCL können nur // in Methoden verwendet werden, die Synchronize aufrufen, z.B.: // // Synchronize(UpdateCaption); // // wobei UpdateCaption so aussehen könnte: // // void __fastcall uploads::UpdateCaption() // { // Form1->Caption = "In Thread aktualisiert"; // } //--------------------------------------------------------------------------- __fastcall Tuploads::Tuploads(bool CreateSuspended) : TThread(CreateSuspended) { Socket = new TServerSocket(frmStart); Socket->OnClientRead = onRead; if(!Socket->Active) { Socket->Port = 1998; try { Socket->Active = true; } catch(...) { Socket->Active = false; } } } //--------------------------------------------------------------------------- void __fastcall Tuploads::Execute() { //---- Hier den Thread-Code plazieren---- } //--------------------------------------------------------------------------- void __fastcall Tuploads::onRead(TObject * Sender, TCustomWinSocket * Socket) { ShowMessage("Daten Empfangen"); for(int i = 1; i == i; i++) { i = i; } ShowMessage("Fertig"); }
-
hallo,
also so wie das jetzt ist, kannst du das lassen, denn der code wird ja niemals was machen...
das ist so ähnlich, als wie wenn man das hauptprogramm eines jeden bcb-gui-programms, da so ausschaöut:WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } return 0; }
dahingehend abändert:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { //Code der ausgeführt werden könnte... }
ein programm das zwar kompiliert wird, aber niemals abgearbeitet wird.
mache dich erst mal eingehender mit der klasse tthread vertraut...mfg
murphy