[CWinThread] scheint sich zu beenden bei Zugriff von 'CMainFrame'
-
Hi,
meine Anwendung (Server) baut eine TCP_IP verbindung zu einem client auf.
Irgendwann empfängt sie eine nachricht durch 'OnReceive()' und startet den Thread:AfxBeginThread(rMyRuntimeClass, NULL, 0, CREATE_SUSPENDED);
Irgendwann sendet der Client erneut etwas und ich möchte eine Variable 'iBefehl' im Thread ändern. Sobald ich die Variable beschreibe wird 'run()' im Thread beendet - wo genau kann ich nicht sagen.
Ich bekomme das Beenden nur mit weil ich innerhalb von run eine while-schleife habe in der ein TRACE("...") ausgegeben wird, der dann halt aufhört.Das seltsame ist:
wenn ich anstelle vom 'TRAGE' folgendes einsetze klappt es und der Thread arbeitet wie er soll:AfxGetMainWnd()->SetWindowText((CString) "GetTickCount()=" + itostr(GetTickCount()))
Das habe ich nur durch Zufall rausgefunden.
Was kann das sein?
-
Da musst Du schon Code zeigen.
Ansonsten setz doch mal Breakpoints....Auch multithreading Programme kann man super debuggen.
-
Socket-Klasse (Subclass von 'CAsyncSocket'):
// Wird bei Programmstart mit Pointer auf 'CMainFrame' initialisiert! CWnd *CCustomSocket::wParent = NULL; void CCustomSocket::OnAccept(int iErrCode) { // Neue Client Verbindung akzeptieren: // (Verbindung wird NUR benutzt um Befehle von Server zu Client und umgekehrt zu senden) aClientSocket = new CCustomSocket(); CAsyncSocket::Accept(aClientSocket); // Parent erzeugt jetzt für jeden Client einen separaten Server-Socket. // Die Verbindung wird NUR genutzt um Audiodaten (durch 'CAudioThread') an den Client zu senden. wParent->SendMessage(CSWM_ACCEPT, (WPARAM) cClientSock); } void CCustomSocket::OnReceive(int iErrCode) { CObArray oDataSets; // Befehl(e) werden von Client-Socket empfangen, Datensätze in 'oDataSets' aufnehmen // ... // Parent schreibt dann auf die Variable 'iBefehl': wParent->SendMessage(CSWM_RECEIVE, (WPARAM) this, (LPARAM) &oDataSets); }
Meine Thread-Klasse:
int CCustomThread::Run() { // Initialisieren: bRunThread = TRUE; do { // Nächsten Durchgang für Subclass aufrufen: if (NextRun()) // Schlafen: Sleep(iDelay); else // Thread abbrechen: bRunThread = FALSE; } while (bRunThread); return (iReturnVal); }
Subclass der Thread-Klasse zur Verarbeitung:
BOOL CAudioThread::NextRun() { do { // Audiodaten an Client senden: // ... // Lasse ich folgende Zeile stehen, funktioniert alles super!?! AfxGetMainWnd()->SetWindowText((CString) "GetTickCount()=" + itostr(GetTickCount())); } while (iBefehl == ASC_PLAY); return (TRUE); }
Zum debuggen:
Die Haltepunkte, die ich im Thread setze, werden irgendwann nicht mehr erreicht. Das scheint mir ziemlich willkürlich zu sein. Ich kann zum debuggen nicht viel sagen.
-
Aber kannst Du evtl. sehen, dass der Thread beendet wird. Du siehst das doch im Debug Ausgabe Fenster. Als auch im Thread Window.