[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?


  • Mod

    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.


  • Mod

    Aber kannst Du evtl. sehen, dass der Thread beendet wird. Du siehst das doch im Debug Ausgabe Fenster. Als auch im Thread Window.


Anmelden zum Antworten