Thread-Beendigung von außerhalb des Threads
-
Moin,
ich weiß, diese Frage wurde schon häufig gestellt und im Netz gibt es ne Menge nützlicher Tutorials dazu, aber irgendwie wollen die alle bei mir nicht so richtig fruchten, also seid ihr mal wieder mein letzte Hoffnung.
Also, ich habe ein Client-Server-Programm geschrieben, klappt auch wunderbar.
Habe einen Worker-Thread, der das Senden bzw. Empfangen übernimmt.
Jetzt möchte ich gerne, dass auf Server-Seite dieser Thread beendet wird, wenn man z.B. auf 'Cancel' drückt.
Problem ist, dass dieser Thread entweder bei 'accept' auf eine Verbindung warten oder aber bei 'recv' auf Daten wartet, so dass ich den Abbruch nicht mit einem Flag machen kann.Hier mal ein bisschen Code:
Starten des Server-Threadsvoid CTcp_ip_v3_ownDlg::OnButtonAction() { if(m_Typ == 0) //Server-Modus { pThread = AfxBeginThread(ThreadServer, this); }else //Client-Modus pThread = AfxBeginThread(ThreadClient, this); }
UINT CTcp_ip_v3_ownDlg::ThreadServer(LPVOID pParam) { CTcp_ip_v3_ownDlg* pDlg = (CTcp_ip_v3_ownDlg*) pParam; pDlg->ActionServer(); //Ab hier arbeitet der Server-Thread return(0); }
Betätigen des Cancel-Buttons
void CTcp_ip_v3_ownDlg::OnButtonCancel() { //if(pThread != NULL) //Existiert der Thread //pThread->Delete(); // 1. getestete Möglichkeit HANDLE hndThread = pThread; // 2. getestete Möglichkeit WaitForSingleObject(hndThread,INFINITE); }
Beide getesteten Möglichkeiten haben den Thread leider nicht beendet.
Das ganze per Terminate() zu realisieren funktioniert leider auch nicht, da pThread vom Typ CWinThread* ist.Wie man unschwer erkennen kann, ist das mein 1. Programm, welches sich mit Multithreading ein bisschen beschäftigt.
Also falls etwas gravierendes falsch ist, wäre eine kleine Erklärung nicht schlecht, bzw. ein Link, der mir die Augen öffnet..Gruß und Dank
chackie-lee
-
Dann verwende die Klasse CAsyncSockets und du hast das Problem nicht.
-
Moin,
das geht leider nicht, da ich die Klasse winsock.h benutzen muss.
Das Programm ist für ein kleines Projekt an meiner FH und der Prof. hat es schon so abgesegnet, ich möchte deswegen nicht allzuviel ändern müssen.Gruß
chackie-lee
-
Dann hast du nur die Möglichkeit den Thread abzuschießen.
AfxEndThread oder so nennt sich die Funktion.
Denke aber das dein Prof. zufrieden ist wenn du ihm ein Programm mit besserem Design lieferst und nicht einfach eine Thread ohne Bereinigung abschießt.
-
N'Abend.
Mit dem Abschießen des Threads wäre ich zufrieden, allerdings kann ich AfxEndThread nur innerhalb des zu beendenen Threads aufrufen und der ist mit 'recv()' beschäftigt.
Ich brauch also ne Möglichkeit den Thread innerhalb eines anderen Threads beenden zu lassen.
Jemand eine Idee??
Gruß
chackie-lee
-
Moin,
wenn ich den Process Viewer benutze, dann zeigt er mir nach dem angeblichen Löschen des 2. Threads meines Programmes immer noch 2 Threads an.
Möchte ich aber in meinem Programm diesen Thread erneut löschen (delete pThread bzw. pThread->Delete), sütrzt mein Programm wegen einer unbehandelten Ausnahme ab.
Also denkt doch anscheinend mein Programm, dass der Thread tot ist aber in Wahrheit existiert er noch munter weiter.Wann kann ich eigentlich Terminate() zum Abschießen benutzen??
Die Klase CWinThread bietet soetwas ja nicht an...Gruß
chackie-lee
-
ich würde den socket von außen mit >> closesocket(...); << schließen. dann müsste die accept/read funktion nämlich aufhören zu blockieren und der thread weiterlaufen worauf hin du ihn dann mittels einer abbruchbedingung sich von alleine beenden lassen könntest...
mach vorsichtshalber noch ne try / catch rum und in der catch dann ne aufräumarbeit und am ende nen return dann geht er im fehlerfall auch sauber raus...
mfg
mightymop
-
Moin,
hey das ist ne super Idee, einfach und banal und sie funktioniert sogar.
Vielen Dank für die Hilfe.
Gruß
chackie-lee