TThread: Zugriff verweigert,Fehler 5 nach Suspend()/Resume()
-
Hallo,
hätte da mal gerne ein ProblemHab nen Indy TCP Client und horche nach Serverdaten mittels nem TThread, da mir ne Lösung mit nem Timer zu unsauber war. Die ersten Versuche mit dem Thread (für mich totales Neuland) waren gut. Nun hab ich aber das Problem mit diesem Suspend() und Resume(). Nachdem ich den Thread mit Suspend() schlafen schicke und ihn später mit Resume() wieder auf den Boden der Tatsachen holen möchte bekomm ich nen bösen bösen Fehler: Zugriff verweigert,Fehler 5.
Mir ist auch klar das man Resume() in der gleichen Anzahl aufrufen muss wie auch Suspend() ausgeführt wurde,um erneut Zugriff zu bekommen. Der Thread wird aber beim aller ersten Start erfolgreich ausgeführt und Funktioniert super. Resume() scheitert beim zweiten Aufruf
Ich hoffe das jemand von euch Adleraugen den Fehler in meinem Code aufdecken kann. Also ich bin fertig mit meinem kryptischen Sprachschatz und sitz da schon wieder seit 2 Tagen dranThread.cpp
void __fastcall MyThread::Execute() { SetName(); while(!Terminated) { Synchronize(Compute); ASleep(); } } //---------------------------- void __fastcall MyThread::Compute() { if(Form1->Client1->Connected()) { char Buff[1024]; Form1->Client1->ReadBuffer(Buff,1024); if(strcmp(Buff,"TCP") == 0) //--------Server Message { TCP_Message *msg = (TCP_Message *)Buff; if(strcmp(msg->Msg,"BYE") == 0) { Form1->Memo1->Lines->Add("Login data wrong"); Form1->Client1->Disconnect(); } if(strcmp(msg->Msg,"OK") == 0) { Form1->Memo1->Lines->Add("Login data ok"); } } } } //------------ void MyThread::ASleep() { Sleep(500); }
Main Form:
void __fastcall TForm1::Client1Connected(TObject *Sender) { if(AThread->Suspended) AThread->Resume(); } //----------------------------------------- void __fastcall TForm1::Client1Disconnected(TObject *Sender) { if(!AThread->Suspended) AThread->Suspend(); } //------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { AThread = new MyThread(true); //Start suspended } //------------------------------------
-
Nun habe ich einen neuen Lösungsansatz der funktioniert. Denkt ihr das es so ok ist ?
void __fastcall TForm1::Client1Connected(TObject *Sender) { AThread = new MyThread(false); //Start suspended = false } //----------------------------------------- void __fastcall TForm1::Client1Disconnected(TObject *Sender) { AThread->Terminate(); }
Edit: Hab mir mal die Thread ID beim starten und terminieren ausgeben lassen:
Clientlog:
SSL Client: SSL status: "SSL negotiation finished successfully" SSL Client: Cipher: name = DES-CBC3-MD5; description = DES-CBC3-MD5 SSLv2 Kx=RSA Au=RSA Enc=3DES(168) Mac=MD5 ; bits = 168; version = SSLv2; Connected. Created: 2044 Login data wrong Disconnecting. Disconnected. Terminated: 2044
Sieht doch gut aus oder ?
-
Hab jetzt den früheren Inhalt der Compute() Funktion in ne Funktion unter Form1 ausgelagert da diese mit Synchronize aufgerufen wird. Ist es so besser ?
void __fastcall MyThread::Execute() { SetName(); while(!Terminated) { Synchronize(Compute); ASleep(); } } //--------------------------------------- void __fastcall MyThread::Compute() { if(Form1->Client1->Connected()) { Form1->Client1->ReadBuffer(Buff,1024); Form1->Server_Received(Buff); } }