Да, дело в том, что, когда я писал компоненты для работы с подобного рода аппаратурой, (Сканеры, принтеры шк, теминалы), мне приходилось использовать OVERLAPPED.. Хм... что-то вроде..
PHP код:
DWORD ScannerData(LPVOID lParam);
{
HANDLE m_hComm;
HANDLE m_hCancelEvent;
OVERLAPPED ov={0,0,0,0,NULL};
char m_szData[256];
HANDLE waitfor[]={m_hCancelEvent, ov.hEvent};
DWORD dwHandleSignaled;
if(!ClearCommError(m_hComm,&dwError,&csStat))
{
TRACE(_T("\nerror ClearCommError() %ld"),GetLastError());
CloseHandle(ov.hEvent);
return(0);
}
//AfxMessageBox(_T("Started!!!"));
z=ResetEvent(ov.hEvent);
if(z==0)
{
z=GetLastError();
//csData.Format(_T("Error:%d"),z);AfxMessageBox(csData);
}
nCount=0;
for(z=0;z<1024;z++)szData[z]=' ';szData[z]=0;
for(z=0;z<255;z++)szBuffer[z]=' ';szBuffer[z]=0;
while(true)
{
ResetEvent(ov.hEvent);
ResetEvent(m_hCancelEvent);
if(WaitCommEvent(m_hComm,&dwEvtMask,&ov)==0)
{
dwHandleSignaled=WaitForMultipleObjects(2,waitfor,FALSE,5000);
// Which event occured?
switch(dwHandleSignaled)
{
case WAIT_OBJECT_0: //cancelled
{ // Time to exit.
//AfxMessageBox(_T("Cancel Event was recieved!"));
CloseHandle(ov.hEvent);
return 0;
}
case WAIT_OBJECT_0 + 1: // ReadEvent signaled.
{
//AfxMessageBox(_T("\nRecieved:"));
ClearCommError(m_hComm, &dwError, &csStat);
ReadFile(m_hComm, szBuffer, csStat.cbInQue, &dwBytes, &ov);
// if (!ReadFile(m_hComm, szBuffer, cst.cbInQue, &dwBytes, &ov))
// {
// if (WaitForMultipleObjects(2, waitfor, FALSE, 2000) == WAIT_OBJECT_0)break;
// }
//for (UINT i = 0; i < cst.cbInQue; i++)
for (UINT i = 0; i < dwBytes; i++)
{
szData[nCount++]=szBuffer[i];
if(szBuffer[i]==13)
{
szData[nCount]=0;
//Получили Ввод, Обработка
nCount = 0;
for(z=0;z<1024;z++)szData[z]=' ';szData[z]=0;
}
}
case WAIT_TIMEOUT:
{
TRACE(_T("."));
break;
}
}
}
else
{
if (dwEvtMask & EV_BREAK)
{
//AfxMessageBox(_T("\nBREAK recieved!Ended!!!"));
break;
}
else if (dwEvtMask & EV_RXCHAR)
{
}
else {TRACE(_T("\n?"));}
}
}
CloseHandle(ov.hEvent);
ov.hEvent = INVALID_HANDLE_VALUE;
//AfxMessageBox(_T("The thread if die!"));
return(0);
}
Вот. Я кое-где комменты повбивал и TRACE раскомментировал..
Все это в отдельном потоке крутилось, разумеется..