Defekte Pipe
-
Hi,
Ziel
Ich möchte einen Subthread erstellen, welcher dann den Benutzer in der Console abfragen (Endlosschleife) und die Meldungen/Texte an den Mainthread soll. Der Mainthread soll alles via printf auf den Bildschirm drucken.Was es jetzt macht
Das Programm fragt mich einmal was ich für einen Text eingeben möchte, und dann bleibt es in einer Endlosschleife.Bitte beachten
Es geht primär um die Pipe, dass die Kommunikation funktioniert, jegliche Kritik zu anderen Dingen die nicht relevant sind bitte ich zu unterlassen. Danke.Der Code
#include <stdio.h> #include <stdlib.h> #include <windows.h> //pipe HANDLE hPipe; DWORD BytesRead, BytesWritten; char Buffer[256]; DWORD WINAPI FirstThread(PVOID pvParam) { char msg[201]; while(1) { printf("\nWhat do you want to say? Type in (MaxChars: 201):"); fgets(msg, 201, stdin); if(ConnectNamedPipe(hPipe, NULL) == 0) { printf("ConnectNamedPipe (Thread) failed with error %d\n", GetLastError()); break; } if(WriteFile(hPipe, msg, 201, &BytesWritten, NULL) == 0) { printf("WriteFile failed with error %d\n", GetLastError()); break; } } return 0; } int main(int argc, char *argv[]) { int x = 0; DWORD dwThreadId; HANDLE hThread; if( (hPipe = CreateNamedPipe("\\\\.\\Pipe\\t3stp1p3", PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 1, 0, 0, 1000, NULL) ) == INVALID_HANDLE_VALUE) { printf("CreateNamedPipe failed with error %d\n", GetLastError()); return 1; } //puts("Before the Thread"); hThread = CreateThread(NULL, 0, FirstThread, (PVOID)&x, 0, &dwThreadId); //printf("The Thread ID is %d!\n", dwThreadId); //puts("After the Thread"); while(1) { if(ConnectNamedPipe(hPipe, NULL) == 0) { printf("ConnectNamedPipe failed with error %d\n", GetLastError()); break; } while(ReadFile(hPipe, Buffer, sizeof(Buffer), &BytesRead, NULL) > 0) { printf("\n-> I got %d bytes: '%s'\n", BytesRead, Buffer); } } CloseHandle(hPipe); CloseHandle(hThread); return 0; }Ich wünsche euch einen guten Rutsch ins neue Jahr!
Vielen Dank und Gruss, Lot-Ionan
-
Benutz den Debucker.
-
und dann bleibt es in einer Endlosschleife.
Ich würd eher sagen ConnectNamedPipe bleibt hängen.
-
Man muss sich glaub ich mit CreateFile mit der Pipe verbinden, erst dann kommt ConnectNamedPipe zurück.
-
Ich hab keinen Tip, dafür ne (möglicherweise) blöde Frage: wieso eine Pipe?
Ein EVENT + CRITICAL_SECTION + std::string z.B. sollte es genauso tun.
Eine Pipe würde ich wirklich nur nehmen wenn du ACLs drauf setzen willst... sonst eher nen Socket (wenns über Prozessgrenzen hinweg gehen soll) oder eben "einfach so" (EVENT + CRITICAL_SECTION).
-
ConnectNamedPipe wird nur auf der Serverseite verwendet!
Der Client verwendet CreateFile und bei Bedarf WaitNamedPipe!
Das hat ........... ja schon geschrieben!Server:
http://msdn2.microsoft.com/en-us/library/aa365588.aspx
Client:
http://msdn2.microsoft.com/en-us/library/aa365592.aspx
-
Vielen Dank für eure Antworten. Mit den beiden Beispielen sollte es funktionieren. Danke.