I have a windows form application that is using multiple threads to connect named pipes to multiple processes...
I use and array of threads:
and start each thread:Code:array<Thread^>^ serverThread;
Each thread starts a named pipe and then enters a while loop to do some comm:Code:{ brokerCnt=this->checkedListBox1->CheckedItems->Count; for(int i=0;i<brokerCnt;i++) { this->serverThread[this->serverNum] = gcnew Thread(gcnew ThreadStart(this,&Form1::startTheServer)); this->serverThread[this->serverNum]->Start(); this->serverNum++; } }
Then when closing the app...I run this method which sets the flag for the threads to exit the while loop and join the threads:Code:private: System::Void startTheServer() { array<Byte>^ inBuffer=gcnew array<Byte>(512); array<Byte>^ outBuffer; array<String^>^ inputArr; array<double>^ tempArr=gcnew array<double>(24); int codeIn; int brokerNum; int pipeNo=this->pipeCnt; this->pipeCnt++; this->namedPipes[pipeNo]=gcnew NamedPipeServerStream(this->pipeName[pipeNo], PipeDirection::InOut,1,PipeTransmissionMode::Byte); this->setText("Pipe Connected and waiting..."); namedPipes[pipeNo]->WaitForConnection(); try { while(this->running) { namedPipes[pipeNo]->Read(inBuffer,0,inBuffer->Length); String^ receiveString=Encoding::UTF8->GetString(inBuffer); inputArr = receiveString->Split('\n'); //todo: add code analyzer...and methods to handle. brokerNum=Int32::Parse(inputArr[0]); codeIn=Int32::Parse(inputArr[1]); switch(codeIn) { case 1: for(int i=2;i<12;i++) { tempArr[i]=Double::Parse(inputArr[i]); } this->setData(tempArr,brokerNum); //put the analysis method in here... break; } outBuffer = Encoding::UTF8->GetBytes( "Got your Message" ); namedPipes[pipeNo]->Write(outBuffer,0,outBuffer->Length); } } catch(IOException^ e) { //this->namedPipes->Close(); } namedPipes[pipeNo]->Read(inBuffer,0,inBuffer->Length); String^ receiveString=Encoding::UTF8->GetString(inBuffer); inputArr = receiveString->Split('\n'); //todo: add code analyzer...and methods to handle. brokerNum=Int32::Parse(inputArr[0]); codeIn=Int32::Parse(inputArr[1]); outBuffer = Encoding::UTF8->GetBytes( "4" ); namedPipes[pipeNo]->Write(outBuffer,0,outBuffer->Length); this->namedPipes[this->brokerCnt]->Close(); }
when this runs and i close the app...all threads go into a [wait, sleep, or join] status based on the debugger thread window...Code:private: System::Void setShutDown() { this->running=false; for(int i=0;i<this->serverNum-1;i++) { if(serverThread[i]->IsAlive::get()) { serverThread[i]->Join(); serverNum--; } } }
Can anyone help in identifying why the join method loop is stopping all threads? I believe it should wait the main thread while the others join...and then finish cleaning up and close...
Any comments?




Reply With Quote