各个线程作的工作是对初始化好的串口进行读写,每个threadProc开始执行,执行过程中及结束前都会向主线程发消息用于主线程跟踪新线程的运行情况,前面开启的线程都运行的很正常,就是最后一个线程不对,连线程开始运行的消息都收到,累加几个线程之后,也是最后一个线程出问题,搞得现在如果要开几个线程,就要在后面加一个什么都不干的线程,这样也不是办法!!!不知道各位大虾又没见过类似情况,关键是你们的解决方法,我实在是搞不懂!下面是我的一些代码//开启串口io线程,
pThread_comm_1_W = AfxBeginThread(WriteProc, &TParam_1);
pThread_comm_2_W = AfxBeginThread(WriteProc, &TParam_2);pThread_comm_1_R = AfxBeginThread(ReadProc, &TParam_1);
pThread_comm_2_R = AfxBeginThread(ReadProc, &TParam_2);//线程函数实现
UINT WriteProc(LPVOID pParam)
{
//write thread proc
BOOL bWriteRes;
DWORD dwBytesWritten;
HANDLE hComm;
TCHAR* pszWBuf;
int nComm;
//TCHAR* pszComm;
const THREAD_PARAM* ptParam = (THREAD_PARAM*)pParam;
//THREAD_PARAM tParam;
//tParam.hComm = (THREAD_PARAM*)pParam;
OVERLAPPED ol = {0};
ol.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); nComm = ptParam->nComm;
hComm = ptParam->hComm;
const HWND hWnd = ptParam->hWnd;
(nComm == 1) ? (pszWBuf = szWBuf_1) : (pszWBuf = szWBuf_2);
//trigger the com outputs print start writing thread
//EnterCriticalSection(&CriticalSection);
::PostMessage(hWnd, WM_WRITE_START, nComm, 0);
//LeaveCriticalSection(&CriticalSection); pszWBuf[32] = '\0';
bWriteRes = WriteFile(hComm, pszWBuf, 32, &dwBytesWritten, &ol);
if(!bWriteRes)
{
if(GetLastError() != ERROR_IO_PENDING)
{
//write error
::PostMessage(hWnd, WM_WRITE_ERR, nComm, 0);
//return -1;
}
else
{
//io pending,triger the outputs to print
::PostMessage(hWnd, WM_WRITE_PENDING, nComm, 0); DWORD dwWait;
//waiting last 1 second;
dwWait = WaitForSingleObject(ol.hEvent, 500);
switch(dwWait)
{
case WAIT_OBJECT_0:
if(GetOverlappedResult(hComm, &ol, &dwBytesWritten, TRUE))
{
::PostMessage(hWnd, WM_WRITE_FIN, nComm, dwBytesWritten);
//return 0;
}
else
::PostMessage(hWnd, WM_WRITE_ERR, nComm, 0);
break;
case WAIT_TIMEOUT:
::PostMessage(hWnd, WM_WRITE_TIMEOUT, nComm, 0);
break;
default:
::PostMessage(hWnd, WM_WRITE_ERR, nComm, 0);
}
//return -1;
}

}
else
//writing succeeded immediately
::PostMessage(hWnd, WM_WRITE_FIN, nComm, dwBytesWritten);
AfxEndThread(0);
return 0;
}
UINT ReadProc(LPVOID pParam)
{
//read thread proc
BOOL bReadRes;
DWORD dwBytesRead;
HANDLE hComm;
TCHAR* pszRBuf;
int nComm;
//TCHAR* pszComm;
const THREAD_PARAM* ptParam = (THREAD_PARAM*)pParam;
OVERLAPPED ol = {0};
ol.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); nComm = ptParam->nComm;
hComm = ptParam->hComm;
const HWND hWnd = ptParam->hWnd;
(nComm == 1) ? (pszRBuf = szRBuf_1) : (pszRBuf = szRBuf_2);
//trigger the com outputs print start writing thread
//EnterCriticalSection(&CriticalSection);
::PostMessage(hWnd, WM_READ_START, nComm, 0);
//LeaveCriticalSection(&CriticalSection); bReadRes =  ReadFile(hComm, pszRBuf, 32, &dwBytesRead, &ol);
if(!bReadRes)
{
if(GetLastError() != ERROR_IO_PENDING)
{
//write error
::PostMessage(hWnd, WM_READ_ERR, nComm, 0);
//return -1;
}
else
{
//io pending,triger the outputs to print
::PostMessage(hWnd, WM_READ_PENDING, nComm, 0); DWORD dwWait;
//waiting last 1 second;
dwWait = WaitForSingleObject(ol.hEvent, 500);//INFINITE when release
switch(dwWait)
{
case WAIT_OBJECT_0:
if(GetOverlappedResult(hComm, &ol, &dwBytesRead, TRUE))
{
::PostMessage(hWnd, WM_READ_FIN, nComm, dwBytesRead);
//return 0;
}
else
::PostMessage(hWnd, WM_READ_ERR, nComm, 0);
break;
case WAIT_TIMEOUT:
::PostMessage(hWnd, WM_READ_TIMEOUT, nComm, 0);
break;
default:
::PostMessage(hWnd, WM_READ_ERR, nComm, 0);
}
//return -1;
}

}
else
//writing succeeded immediately
::PostMessage(hWnd, WM_READ_FIN, nComm, dwBytesRead);

AfxEndThread(0);
return 0;
}