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