I have a windows form application that is using multiple threads to connect named pipes to multiple processes...
I use and array of threads:
Code:
array<Thread^>^ serverThread;
and start each thread:
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++;
}
}
Each thread starts a named pipe and then enters a while loop to do some comm:
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();
}
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 setShutDown()
{
this->running=false;
for(int i=0;i<this->serverNum-1;i++)
{
if(serverThread[i]->IsAlive::get())
{
serverThread[i]->Join();
serverNum--;
}
}
}
when this runs and i close the app...all threads go into a [wait, sleep, or join] status based on the debugger thread window...
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?