Problem mit einer NamedPipe in einem Thread



  • Hallo, ich hätte da nen Problem mit einer NamedPipe die in einem Thread aufgerufen wird.
    Das ganze verhält sich folgendermaßen:

    Ich habe ein Funktion, die heißt connect. Diese habe ich zu einem Thread gemacht mit

    UINT CPipeConnection::connect(LPVOID pParam)
    

    , wobei CPipeConnection die Klasse ist, in der sich die Funktion befindet.

    In der Funktion bzw. Thread connect wird nun eine NamedPipe erzeugt, und zwar folgendermaßen:

    for ( ; ;  ) 
    	{ 
    		hPipe = CreateNamedPipe( 
    			lpszPipenamePipe,			// pipe name 
    			PIPE_ACCESS_DUPLEX,			// read/write access 
    			PIPE_TYPE_MESSAGE |			// message type pipe 
    			PIPE_READMODE_MESSAGE |		// message-read mode 
    			PIPE_WAIT,					// blocking mode 
    			PIPE_UNLIMITED_INSTANCES,	// max. instances  
    			512,						// output buffer size 
    			512,						// input buffer size 
    			10000,						// client time-out 
    			NULL);  
    
    		if (hPipe != INVALID_HANDLE_VALUE) 
    		{
    			hf->HauptFenster->m_ListBoxAusgabe.AddString("Die 'Pipe' Erfolgreich erzeugt !!!");
    
    			//Ab hier wird solange gewartet bis ein Signal an die Pipe kommt
    			fConnectedPipe = ConnectNamedPipe(hPipe, NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED);
    
    			if(fConnectedPipe)
    			{ ... ... ... usw.
    

    Soweit klappt auch alles. Sprich ich kann den Thread erzeugen mit

    AfxBeginThread(CPC.connect, pParam);
    

    ,
    kann auch ganz normal mit der Pipe arbeiten usw.

    das Problem ist nun, das ich nicht weiß wie ich den Thread richtig beende. Da der Thread aus der View Klasse (MFC) heraus aufgerufen wird, und zwar wenn ich da auf meinen Start Button klicke.
    sieht folgendermaßen aus:

    void CMeinView::OnBnClickedBnstart()
    {
    	CPipeConnection CPC;
    
    	HAUPTSTRUCT* pParam = new HAUPTSTRUCT;
    	pParam->HauptFenster = this;
    
    	AfxBeginThread(CPC.connect, pParam);
    
    	// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.*/
    }
    

    Frage nun, wie kann ich den Thread mit dem Beenden Button richtig beenden ??? 😕
    Sprich, was kommt da rein:

    void CMeinView::OnBnClickedBnbeenden()
    {	
    	// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
    };
    

    Und zwar mußte ich das mit dem Thread so machen, weil wenn die Pipe auf Daten gewartet hat, war das Dialogfenster eingefroren.

    Ich denke das Problem liegt in dieser Zeile:

    //Ab hier wird solange gewartet bis ein Signal an die Pipe kommt
    		fConnectedPipe = ConnectNamedPipe(hPipe, NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED);
    

    Es wär mir unter umständen auch schon damit geholfen ,wenn man das waren, wie in der Oberen Zeile beschrieben beenden könnte.

    Habs auch schon versucht mit:

    GetParentFrame()->DestroyWindow()
    	TerminateThread(0,0);
    	ExitThread(0);
    	PostQuitMessage(0);
    	AfxGetThread()->Delete();
    	AfxEndThread(0);
    	exit(0);
    

    im Beenden Button, aber endweder es tut sich nix, oder das Programm Stürzt ab, oder das Programm wird beended aber nicht ordungsgemäß der Thread.

    Ach ja, wenn ich den Thread ma gestartet hab, und dann das Programm beende mittels X odre im Menü Beenden (Standartmäßig schon vorhanden), dann kommt immer sowas von wegen in der Ausgabe des Debugmodus:

    Detected memory leaks!
    Dumping objects ->
    {338} normal block at 0x00326858, 12 bytes long. ... usw.
    

    Bitte deswegen um Hilfe, weiß einfach nich mehr weiter !! 😞

    Vielen Dank im voraus,

    Slawo


Anmelden zum Antworten