Problem mit 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);
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.
Bitte deswegen um Hilfe, weiß einfach nich mehr weiter !!
Vielen Dank im voraus,
Slawo
-
Das beste dürfte es sein, du überlässt es dem Thread, sich selbst zu beenden - dein Hauptprogramm setzt in der OnBeenden()-Methode eine Statusvariable, die die Thread-Funktion wiederfinden kann und diese prüft in regelmäßigen Abständen den Status ab und ruft dann AfxEndThread() auf, wenn er gesetzt ist.
(schau mal ins MFC-Forum, da gibt es ein Beispiel zu dieser Arbeitsweise)
-
thx für den Hinweis, check ich mal aus.
bin für jeden Hinweis dankbar.
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.