Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно организовать задержку при обращении к USB? [D6, WinXP]


misyachniy ©   (2005-05-12 14:44:00) 

Работаю с USB устройством.
Драйвер USBBULK.SYS из комплекта WINDDK.

Открываю в начале устройство.

hUSB:=USBDeviceOpen;
if hUSB=Invalid_handle_value then
CriticalError('Ошибка открытия устройства!');

Открывается без вопросов.

Затем открываю для доступа pipes (2 пары по 16 и 64 байта)

По скольку их 4 то написал функцию (передрал с пимера Microsoft).
hGenericIn:=OpenPipe(NameDevice+'\PIPE00',Generic_Read);

Вот здесь и начинаются вопросы:

Если я в IDE поставлю точку останова на вызове открытия первой pipe, то то после нажатия F9 программа работает далее без вопросов. Если запустить без остановки то довольно часто pipe не открывается и мне приходится завершать программу с ошибкой.

Я модифицировал процедуру открытия pipe.
Добавил задержки и многократный вызов процедуры открытия.

// ---------------------------------------------------------
function OpenPipe(s:string;ReadOrWrite:dword): tHANDLE;
var tmp:tHandle;
   TryCount:dword;
begin
TMP:=Invalid_handle_value;
TryCount:=1000;
while (tmp=Invalid_handle_value) and (TryCount>0) do
begin
tmp:=CreateFile(PChar(s),
       ReadOrWrite,
       0,
       nil,
       OPEN_EXISTING,
       FILE_FLAG_OVERLAPPED,
       0);
dec(TryCount);
delay(10);
end;
if TMP=Invalid_handle_value then
 CriticalError('Критическая ошибка :'+S+'!');
result:=tmp;
end;
//---------------------------------
При этом прогамма задумывается секунд на 5.
Но иногда все-же не открывает первую pipe.

Диспечер задач Windows показывает что процессор загружен на 100%

Я так понимаю, что поскольку моя программа обращается к вводу выводу(открытие файла) то Windows отдает ей много процессорного
времени, а мне нужно чтобы программа просто ждала событие открытие файла.

Я использую вот такую процедуру формирования задержки

Procedure Delay(ms:cardinal);
var thetime:cardinal;
begin
thetime:=GetTickCount+ms;
while thetime>GetTickCount do Application.ProcessMessages;
end;

Будьте снисходительны и простите за длинннннное вступление ;-).
Спаибо за ответы.


misyachniy   (2005-05-12 16:34:00) [1]

Не помогает  :-(
Переключение задач в трее - тоже приводит к быстрому открытию нужных pipes.
Может еще как можно ждать?


-=XP=-   (2005-05-12 16:01:00) [2]

Delay(ms); -> Sleep(ms);

OPEN_ALWAYS


Наверх

Титульная страница Поиск, карта сайта Написать письмо