А вот к чему я пришол:
bool CIMProto::Login2(char *login,char *pass,u_long status)
{
unsigned int thrdaddr;
if(connected && !logining)
{
try
{
if(sendmtx=CreateMutex(NULL,false,NULL))
{
DbgPrint("Login2: send CreateMutex error...");
throw 0;
}
if(recvmtx=CreateMutex(NULL,false,NULL))
{
DbgPrint("Login2: recv CreateMutex error...");
throw 1;
}
if(pingthrd=(HANDLE)_beginthreadex(NULL,0,(PTHREAD)PingThread,this,0,&thrdaddr))
{
DbgPrint("Login2: ping _beginthreadex error...");
throw 2;
}
if(recvthrd=(HANDLE)_beginthreadex(NULL,0,(PTHREAD)RecvThread,this,0,&thrdaddr))
{
DbgPrint("Login2: recv _beginthreadex error...");
throw 3;
}
}
catch(int errcode)
{
switch(errcode)
{
case 3:
{
TerminateThread(pingthrd,0);
WaitForSingleObject(pingthrd,INFINITE);
CloseHandle(pingthrd);
}
case 2: CloseHandle(recvmtx);
case 1: CloseHandle(sendmtx);
}
DbgPrint("Login2: error...");
return false;
}
logining=true;
DbgPrint("Login2: successfull...");
return true;
}
DbgPrint("Login2: not connected or loginning error...");
return false;
}