ErrorCode 231: "All pipe instances are busy."
-
Hallo,
ich schreibe gerade ein Tool, bzw zwei, die via Pipes Daten austauschen.
Um genau zu sein, schreibt das Servertool, welches die Pipe erzeugt Texte in die Pipe und das ClientTool liest diese Texte aus und verarbeitet sie dann.Das klappt auch eigentlich ganz wunderbar.
Doch, wenn ich jetzt die Verbindung des Clients mit der Pipe beende und später wieder herstellen möchte, wird keine Verbindung aufgebaut.
Hier mal der mir wichtig erscheinende Code:
Server:
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { InitializeCriticalSection (&CriticalSection); PipeHandle = INVALID_HANDLE_VALUE; } void __fastcall TForm1::FormCreate(TObject *Sender) { // Pipe wird erstellt: PipeHandle = CreateNamedPipe ( lpszPipename, PIPE_ACCESS_DUPLEX | FILE_FLAG_WRITE_THROUGH, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 20, cSendBlockBufSize, // = 1024 cSendBlockBufSize, // = 1024 INFINITE, &sa ); ...... } void __fastcall TForm1::Button1Click(TObject *Sender) { DWORD i; SetLastError (0); //Zu sendenden text zusammenstellen: //Zeilenumbruch + Text im Editfeld: char *Value = new char [strlen(Edit1->Text.c_str ())+1]; Value[0] = 13; Value[1] = 0; strcat(Value, Edit1->Text.c_str ()); int groesse = (strlen(Value)+1); EnterCriticalSection (&CriticalSection); BOOL Ok = WriteFile ( PipeHandle, &Value[0], groesse, &i, NULL ); LeaveCriticalSection (&CriticalSection); if (Ok) StatusBar1->SimpleText = "Written!"; else StatusBar1->SimpleText = "Not written!"; StatusBar1->SimpleText = StatusBar1->SimpleText + " | Last ErrorCode: "; StatusBar1->SimpleText = StatusBar1->SimpleText + GetLastError (); }
Client:
void __fastcall TForm1::Button1Click(TObject *Sender) { // Verbinden/Trennen - Button if (Button1->Tag == 0) { Button1->Tag = 1; Button1->Caption = "Disconnect"; MyPipe = new Pipe(true); MyPipe->FreeOnTerminate = true; MyPipe->Resume (); } else { MyPipe->Terminate (); } } __fastcall Pipe::Pipe(bool CreateSuspended) : TThread(CreateSuspended) { PipeHandle = CreateFile (lpszPipename, GENERIC_READ, FILE_SHARE_READ , NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); int err = GetLastError (); // Beim ersten Durchlauf gibts keine Probleme. // ErrorCode: 0 // Beim zweiten und weiteren Neu-verbinden klappt es nicht mehr. // ErrorCode: 231 "All pipe instances are busy." Retrv = new char [cSendBlockBufSize]; strset(Retrv, 0); InitializeCriticalSection( &CriticalSection ); } void __fastcall Pipe::Execute() { //...... while (!Terminated) { if (PipeHandle != INVALID_HANDLE_VALUE) { EnterCriticalSection( &CriticalSection ); fReadBufferFilled = 0; unsigned long DataAvail = 0; if (PeekNamedPipe(PipeHandle, NULL, NULL, NULL, &DataAvail, NULL)) { if (DataAvail > 0) { Ok = ReadFile ( PipeHandle, Retrv, cSendBlockBufSize, &fReadBufferFilled, NULL ); }else //Pipe ist leer... { Ok = false; } } else { Ok = false; } else // PipeHandle == INVALID_HANDLE_VALUE: Terminate (); } //Thread ist jetzt "Terminated" Form1->Label2->Caption = "Disconnected!"; Form1->Button1->Tag = 0; Form1->Button1->Caption = "Connect"; } __fastcall Pipe::~Pipe () { CloseHandle (PipeHandle); }
Habe ich die verbindung zwischen Client und Pipe falsch getrennt?
Hoffe ihr könnt mir schreiben, woran es liegt.Bin für jeden Hinweis dankbar.
Grüße,
Muesli
-
Wie wärs damit?
DisconnectNamedPipe( PipeHandle ); CloseHandle (PipeHandle);
-
ne leider nicht.