Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Как определить конец файла?  (Прочитано 65362 раз)
0 Пользователей и 1 Гость смотрят эту тему.
awolf
Гость
« Ответ #30 : 11-07-2003 13:38 » 

Блииин, с инетом траблы. Сообщение продублировалось.  :?
Записан
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #31 : 11-07-2003 13:43 » 

Лишне удалил.

Вообще это лучше в драйверах спросить. Таймаут порта от драйвера зависит и там устанавливается.
Записан

Megabyte be with you!
awolf
Гость
« Ответ #32 : 11-07-2003 13:43 » 

Я вообще использую OVERLAPPED чтение/запись в порты. Очень удобно. Во всяком случае можно регулировать таймаут ожидания события окончания операции. При неуспешном ожидании можно операцию отменить.
Записан
Джон
Гость
« Ответ #33 : 11-07-2003 13:50 » 

была такая идея, через DeviceIoContro() только с каким кодом?
используется стд драйвер под w2k sp4. Но в идеале должно на работать
на всех платформах. Может его (таймаут) можно как-нить установить?
Покопался на гуглях, но там только вопросы - народ похоже мучаеся с этим
с конца прошлого тысячелетия - офигеть!!! Улыбаюсь
Записан
Джон
Гость
« Ответ #34 : 11-07-2003 13:56 » 

Думал и про это, сложновато - у меня уже и так 3 нитки висит. А потом, насколько медленне будет при нормальных условиях? когда данные уходят без проблемм.
Свой таймаут у меня тоже есть, проблема - WriteFIle() долго висит, хоть ты дерись.
Выпрыгивал бы он побыстрее всё было бы Хокей.
Записан
awolf
Гость
« Ответ #35 : 11-07-2003 13:58 » 

IOCTL можно посмортреть в NT DDK. Там же и описание структур для IoCtl-запросов.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #36 : 11-07-2003 14:01 » 

Цитата: Джон
к awolf
Эт точно - на практике (честно) ни разу проблем не было.
Но раз на то пошло то надо и такие вещи делать:

char *psz = new char[256];

if(psz==NULL)
{
    // Нету 256 байт памяти!!! помогите!!!!
     throw(0);
}

но кто это делает? я - никогда


Я всегда делаю.
Ты тут еще не учитываешь один момент - по Стандарту new при нехватке памяти выбрасывает исключение, это он раньше NULL возвращал, но у Microsoft new наверно всегда NULL будет возвращать.
Записан
awolf
Гость
« Ответ #37 : 11-07-2003 14:01 » 

При Оверлапе WriteFile и ReadFile выпрыгивают сразу. Тебе самому нужно определять факт завершения(незавершения) операции. Тут ты можешь с этим таймаутом как захочешь играться.
Записан
awolf
Гость
« Ответ #38 : 11-07-2003 14:06 » 

SlavaI, Я тоже контролирую выделение памяти. Это уже как "Отче Наш". Но я пользуюсь malloc и free. Там не надо никаких исключений отслеживать. Все ясно и понятно - если NULL, то значит траблы при выделении памяти.
Записан
awolf
Гость
« Ответ #39 : 11-07-2003 14:09 » 

Джон, В DDR не много IOCTL-кодов для параллельного порта. И кода для установления таймаутов операций нет.  Жаль
Записан
Джон
Гость
« Ответ #40 : 11-07-2003 14:11 » 

Похоже другого пути нет...
Что значит сразу? Нет или лучше так - Сколько байт он отправит (при идеальных условиях) до выпрыгивания?

Может в курсе какого размера буфер можно ему передать зараз. У СОМа можно установить размер FIFO - есть чё-нить похожее у параллельного?
Записан
awolf
Гость
« Ответ #41 : 11-07-2003 14:14 » 

Вот примерно код для Оверлап чтения.
Сразу - это очень сразу.
Кол-во прочитанных/записанных байт определяется GetOverlappedResult.

   BOOL         result;
   unsigned long   com_read, last_error;
   OVERLAPPED      overlap_ctx;

   if (h_com == NULL || data_buf == NULL)
   {
      //printf("comport_read: args\n");
      return -1;
   }

   if (buf_length == 0)
   {
      return 0;
   }

   memset(&overlap_ctx, 0, sizeof(OVERLAPPED));

   overlap_ctx.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
   if (overlap_ctx.hEvent == NULL)
      return -1;

   com_read = buf_length;
   result = ReadFile(h_com, data_buf, buf_length, &com_read, &overlap_ctx);

   if (result != TRUE)
   {
      last_error = GetLastError();

      if (last_error == ERROR_HANDLE_EOF)
      {
         CloseHandle(overlap_ctx.hEvent);

         return -1;
      }
   }

   if (WaitForSingleObject(overlap_ctx.hEvent, 5000) == WAIT_OBJECT_0)
   {
      com_read = 0;
      GetOverlappedResult(h_com, &overlap_ctx, &com_read, FALSE);

      ResetEvent(overlap_ctx.hEvent);
      CloseHandle(overlap_ctx.hEvent);

      return (int)com_read;
   }
   else
   {
      CancelIo(h_com);

      CloseHandle(overlap_ctx.hEvent);
      return 0;
   }
Записан
awolf
Гость
« Ответ #42 : 11-07-2003 14:20 » 

Тут вот еще одни люди говорят, что для оперций с LPT в идеале использовать Оверлапед чтение/запись.
Записан
Джон
Гость
« Ответ #43 : 11-07-2003 14:21 » 

awolf, спасибо, что в ДДК посмотрел у менся его как-раз под рукой нету. Уже хотел было лезть.

SlavaI, Интересно - как это можно проверить?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #44 : 11-07-2003 14:26 » 

to awolf, а зачем тебе OVERLAPPED ты же все равно превращаешь асинхронное чтение в синхронное с помощью WaitForSingleObject, в чем смысл- в пяти секундах? То есть думаешь если не успели прочитать- то ошибка.
И почему если возвращено FALSE ты проверяешь только на ERROR_HANDLE_EOF, там наверно логичнее проверить на ERROR_IO_PENDING и если не он то ошибка пр попытке чтения- иначе началось асинхронное чтение.
Записан
Джон
Гость
« Ответ #45 : 11-07-2003 14:28 » 


avolf,
В общем я ща исправляю ошибки других:
наскоро вот такое набросал:
void CPortLpt::IEEE1284NibbleWrite(byte* pbyBuffer, UINT nBufferLen, UINT* pnBytesWritten)
{
DWORD dwHasWritten = 0;
DWORD dwToWrite = 0;
*pnBytesWritten = 0;

byte* pbyCur = pbyBuffer;

EnterCriticalSection(&m_csThread);

do
{
dwToWrite = nBufferLen > 512 ? 512 : nBufferLen;
WriteFile(m_hPort,pbyCur, dwToWrite, &dwHasWritten,NULL);

// Show written data:
if( m_pPortInterface )
{
for(int i=0; i<dwHasWritten; i++) m_pPortInterface->ShowWriteByte((DWORD)pbyCur[i]);
}

*pnBytesWritten += dwHasWritten;
pbyCur+=dwHasWritten;

if(dwHasWritten!=dwToWrite)
{
break;
}
nBufferLen-=dwHasWritten;
}while(nBufferLen>0);

LeaveCriticalSection(&m_csThread);
}

и вся эта фигня крутится в ещё одном цикле в котором у меня уже есть таймаут
512 - это для меня опять таки магическая цифра, но я её пока оставил. В принципе так работает. Виснит в не зависимости от данных хоть 3 байта хоть 100 кб
« Последнее редактирование: 14-04-2006 22:16 от Алексей1153 » Записан
Джон
Гость
« Ответ #46 : 11-07-2003 14:30 » 

SlavaI, так в этом то и фокус - синхронная висит у меня долго
Записан
awolf
Гость
« Ответ #47 : 11-07-2003 14:31 » 

Это примерный кусок, который еще дорабатывать надо. WaitForSingleObject я использую для регулирования таймаута чтения/записи (хотя здесь намертво задано 5 секунд). ERROR_IO_PENDING возникает, если ReadFile или WriteFile возвращает TRUE (это по собственным наблюдениям).
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #48 : 11-07-2003 14:32 » 

to Джон- чего проверить? Выбрасывает ли исключение при нехватке памяти? У майкрософта не выбрасывает. Если на 32 разрядной винде работаешь  то возьми и попробуй 2 GB памяти получить и узнаешь.
Записан
awolf
Гость
« Ответ #49 : 11-07-2003 14:38 » 

Джон, Можно полазить еще www.sources.ru. Может там че-нить по LPT есть
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #50 : 11-07-2003 14:39 » 

to Джон- вот так проверяй

char* p;
      try
      {
        p = new char[3000000000];
      }catch(...)
      {
         cout<<"Exception"<<endl;
      }
      cout<<((int)p)<<endl;
      return 0;

Не волнуйся - физически тебе иметь много оперативки не надо, так как она только виртуально в этом примере выделится, а физические будут выделяться по мере надобности, но при том объеме, что я запросил выделить в адресном пространстве память невозможно, возвратит NULL;
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #51 : 11-07-2003 14:42 » 

Цитата: awolf
ERROR_IO_PENDING возникает, если ReadFile или WriteFile возвращает TRUE (это по собственным наблюдениям).


Такого не должно быть- должен быть FALSE.
Вот цитатка из SDK
If hFile was opened with FILE_FLAG_OVERLAPPED and lpOverlapped is not NULL, the read operation starts at the offset specified in the OVERLAPPED structure and ReadFile may return before the read operation has been completed. In this case, ReadFile returns FALSE and the GetLastError function returns ERROR_IO_PENDING. This allows the calling process to continue while the read operation finishes.
Записан
Джон
Гость
« Ответ #52 : 11-07-2003 14:49 » 

Мой многолетний опыт показывает, что халявы всё-таки не бывает. Как не мучайся,
а самому делать придется. Поэтому остаётся расчитывать на помощь, простую человеческую помощь.
Да я тут прикинул - за то время пока я это всё искал ужеб асинхронную сделал.
Вот она лень человеческая! Ну да ладно - зато пообщался немного.

Ладно парни - всем спасибо, а то мне ещё до дому 50 км пилить. Так что я сегодня больше не появлюсь.
А кстати - куда вопросы такого рода отправлять? Так никто и не сказал. В Драйверы или Операционнки?

Ну всем пока
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #53 : 11-07-2003 15:41 » 

Глюк
Записан

А птичку нашу прошу не обижать!!!
awolf
Гость
« Ответ #54 : 11-07-2003 16:01 » new

SlavaI, Этот кусок кода относится как раз к тому случаю, когда простая человеческая лень ломит тебя. Но в нем статус IO_PENDING тоже обрабатывается.
Конечно, это кусочек не претендует на "ОСКАР" Голливуда  Отлично
Записан
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines