Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

Как правильно организовать задержку при обращении к USB?   Найти похожие ветки 

 
misyachniy ©   (2005-05-12 14:44) [0]

Работаю с 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;

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


 
-=XP=- ©   (2005-05-12 16:01) [1]

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

OPEN_ALWAYS


 
misyachniy ©   (2005-05-12 16:34) [2]

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



Страницы: 1 вся ветка

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.034 c
1-1118401791
seregka
2005-06-10 15:09
2005.07.11
Архивация при помощи Zlib


14-1118005350
Лёха2005_
2005-06-06 01:02
2005.07.11
Расшифровка cookie


14-1118222987
MadAngel
2005-06-08 13:29
2005.07.11
Посоветуйте цифровик


1-1118904889
Alex_C
2005-06-16 10:54
2005.07.11
Как изменить тип курсора


1-1118916761
Aaz
2005-06-16 14:12
2005.07.11
Математические основы шифрования