Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > При асинхронном чтении нет данных


Автор: BBulat 20.9.2010, 15:29
Запись и чтение произвожу в разных потоках. Работаю с USB-девайсом через драйвер собранный в DriverStudio. Запись в потоке как в синхр., так и в асинхр. режимах работает нормально, чтение же  в потоке работает только в синхронном режиме, в асинхронном ничего не принимает - WaitForSingleObject возвращает WAIT_TIMEOUT. В основном же потоке однократное чтение в асинхр режиме работает без проблем.
Код

UINT ReceiveThread( LPVOID pParam )
{
    stop_r = 0;
    while(stop_r == 0)
    {        
        RealRead = 0;

                           //Синхр. режим. Нормально работает
                           //ReadFile(PipeIn, &buf_r, 60, &RealRead, NULL); 

                         
                         //Асинхронный режим  
               bool bReadDone = false;

                         while(!bReadDone)
                         {
                             DWORD success = ReadFile(PipeIn, &buf_r, 60, &RealRead, &gOverLapped_Read);
                              //обработаем результат ReadFile
                              if(success == 0)
                              {
                                 DWORD  dwError = GetLastError();
                                   if(dwError == ERROR_IO_PENDING)
                                   {
                                        
                                        DWORD dwWait = WaitForSingleObject(hEvent_Read,100);
                                        switch(dwWait)
                                        {
                                             case WAIT_OBJECT_0:
                                                  if(!GetOverlappedResult(PipeIn,&gOverLapped_Read,&RealRead, FALSE))
                                                  {
                Sleep(1);
                                                  }
                                                  else
                                                  {
                                                      bReadDone = true;
                                                  }
                                             break;
                                             case WAIT_TIMEOUT:       
                                             break;
                                        }
                                   }
                              }
                              else
                              {
                                   bReadDone = true;
                              }
                         }

        RD_spd += RealRead;        
        RealRead=0;
                ...
                }//while(stop_r == 0)
    return 0;
    AfxEndThread(0, TRUE); 
} 


Хендлы для асинхронного режима созданы правильно:

Код

    PipeOut = CreateFile(devNameOut, 
                           GENERIC_WRITE,
                           FILE_SHARE_WRITE,
                           NULL,
                 OPEN_EXISTING, 
                           FILE_FLAG_OVERLAPPED, //NULL
                 NULL);
 //проверка результата
        if (PipeOut != INVALID_HANDLE_VALUE) init = 1;
        else init = 0;

        PipeIn = CreateFile(devNameIn, 
                            GENERIC_READ,
                            FILE_SHARE_READ,
        NULL,
        OPEN_EXISTING, 
                            FILE_FLAG_OVERLAPPED, //NULL
        NULL);
 //проверка результата
        if (PipeIn != INVALID_HANDLE_VALUE) init = 1;
        else init = 0;
    //}


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

            hEvent_Write = CreateEvent( 
                                NULL,    // default security attribute 
                                TRUE,    // manual-reset event 
                                TRUE,    // initial state = signaled 
                                NULL);   // unnamed event object 



            // set up overlapped structure fields
            gOverLapped_Write.Offset     = 0; 
            gOverLapped_Write.OffsetHigh = 0; 
            gOverLapped_Write.hEvent     = hEvent_Write; 

            hEvent_Read = CreateEvent( 
                                NULL,    // default security attribute 
                                TRUE,    // manual-reset event 
                                TRUE,    // initial state = signaled 
                                NULL);   // unnamed event object 



            // set up overlapped structure fields
            gOverLapped_Read.Offset     = 0; 
            gOverLapped_Read.OffsetHigh = 0; 
            gOverLapped_Read.hEvent     = hEvent_Read; 
}


Почему я не могу принять данные в потоке в асинхр режиме? Поток создаю так AfxBeginThread(ReceiveThread, pNewObject);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)