Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> При асинхронном чтении нет данных, При синхронном данные поступают(USB-дев) 
:(
    Опции темы
BBulat
Дата 20.9.2010, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 5.12.2006

Репутация: нет
Всего: нет



Запись и чтение произвожу в разных потоках. Работаю с 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);
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0662 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.