Показать сообщение отдельно
Старый 17.06.2004, 12:09   #12  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Да, дело в том, что, когда я писал компоненты для работы с подобного рода аппаратурой, (Сканеры, принтеры шк, теминалы), мне приходилось использовать 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_hCancelEventov.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_hCommszBuffercsStat.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 0dwBytesi++)
                                {
                                
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 раскомментировал..
Все это в отдельном потоке крутилось, разумеется..