Problem mit NamedPipes
-
Hallo,
ich bin neu hier und auch die Suche hat mir nicht wirklich weiter geholfen. Auch meine G. Suche war leider erfolglos. Aber vielleicht hat hier jemand die Lösung für mein Problem..Es geht wie schon im Titel gesagt um NamedPipes.
Ich erstelle also eine NamedPipe mitNamedPipe = CreateNamedPipe("\\\\.\\pipe\\einePipe\0", PIPE_ACCESS_DUPLEX , PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 10, 102400,102400, 3000000 , &m_pSecAttrib);und versende dann mit ReadFile und WriteFile ca 150 Byte Daten im Abstand von 150ms über diese Pipe..
So jetzt zu meinem eigentlichen Problem.
Die Kommunikation über die Pipe funktioniert im Großen und Ganzen recht gut, allerdings stoppt der Lesevorgang der Pipe in einem unbestimmten Zeitraum und ohne bestimmten Grund und es wird der Fehler ERROR_NO_DATA zurückgegeben obwohl noch Daten in der Pipe sein müssten und auch weiterhin Daten in die Pipe geschrieben werden. Auch lässt sich die Pipe nicht mehr schließen zb. neu Verbinden bevor nicht das Client-Programm neu gestartet wurde.Gibt es eine Begrenzung der Zugriffe zb. dass nur 10000 * in einem Abstand Daten aus der Pipe gelesen werden können oder woran könnte es noch liegen?
Hat diesbezüglich schon einmal jemand Erfahrungen gemacht und kann mir da weiterhelfen?
Danke,
-
Es gibt keine Begrenzung. Ich verwende nur named pipes zur Kommunikation zwischen meinen Clients und den Services.
Wie liest Du denn die Daten? Overlapped? ERROR_NO_DATA deutet darauf hin.
Zeig doch mal ein wenig Code, von der Routine, die liest.
-
Hi, so das ist die Lesefunktion die mit einem Timer aufgerufen wird, allerdings hab ich mitlerweile einen Workaround gefunden der mir aber auch nicht ganz schlüssig ist. Ich habe noch eine zweite Pipe über einen anderen Thread am laufen und wenn ich bevor ich den Lesevorgang starte über die zweite Pipe eine Nachricht sende
WriteFile(hPipeTwo, "X" , 1, &RETDWORD, NULL);funktioniert die ganze Sache fehlerfrei. Aber woran kann das liegen? Beide Pipes werden auf PIPE_NOWAIT gesetzt.
VOID CALLBACK PipeTimer( HWND hwnd,UINT uMsg,UINT idEvent, DWORD dwTime) { SetNamedPipeHandleState(hNamedPipe, PIPE_READMODE_BYTE | PIPE_NOWAIT, NULL , NULL); ReadFile(hNamedPipe, &rfpcbs , sizeof(rfpcbs), &RETDWORD, NULL); if(RETDWORD > 0) { if(!rfpcbs.IsValid()) { Sleep(25); return; } if(rfpcbs.bIsCommand) { rfpcbs.iCommandReturn = MessageBox(hDlgMessage, rfpcbs.szMsg, "Message", rfpcbs.iCommandMode); WriteFile(hNamedPipe, &rfpcbs , sizeof(rfpcbs), &RETDWORD, NULL); Sleep(100); return; } if(rfpcbs.iPercent > 0 && rfpcbs.iPercent < 101) { SetDlgItemText(hwnd, IDC_STC1, rfpcbs.szMsg); SendMessage(GetDlgItem(hwnd, IDC_PGB1), PBM_SETPOS, rfpcbs.iPercent, 0); } if(rfpcbs.iFilePercent >= 0 && rfpcbs.iFilePercent <= 101) { SetDlgItemText(hwnd, IDC_STC2, rfpcbs.szFileName); SendMessage(GetDlgItem(hwnd, IDC_PGB2), PBM_SETPOS, rfpcbs.iFilePercent, 0); } Sleep(50); } }
-
Hier ist keine Lesefunktion, und Du hast nicht gesagt ob du overlapped IO verwendest.
Du hast mit Sicherheit einen Read Vorgang der blockiert.
-
Nein, Overlapped IO verwende ich nicht für die Pipes und ich bin mir ziemlich sicher, dass die Pipeblockierung mit
SetNamedPipeHandleState(hNamedPipe, PIPE_READMODE_BYTE | PIPE_NOWAIT, NULL , NULL);aufgehoben wird. Trotzdem kann ich es mir nicht erklären, wieso dieses Problem nicht mehr besteht, solange Daten an die andere Pipe gesendet wird. Ich kann zwar mit meinem Workaround leben, allerdings wüste ich doch schon gern die Ursachen dafür.
-
Weil Du vermutlich einen blockierenden Read auf die andere Pipe ausführst.
Wenn Du ReadFile auf eine Pipe ausführst muss Dir klar sein, dass dieser Read evtl. nicht zurückkommt, bis Daten da sind.
Wenn Du also zwei Pipes hast musst Du mit Overlaped I/O arbeiten...