Главная страница
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.035 c
11-1101251725
XProger
2004-11-24 02:15
2005.07.11
Старнная ошибка в RichEdit1


9-1112119752
new1
2005-03-29 22:09
2005.07.11
Привет! А* в 3D.Допустим есть 3-х мерный массив.Как реализовать А


14-1118309693
КаПиБаРа
2005-06-09 13:34
2005.07.11
Помогите решить практическую задачу


14-1118828872
emfw
2005-06-15 13:47
2005.07.11
Вопросы


14-1118227771
DmitMal
2005-06-08 14:49
2005.07.11
Delhi 6 и Delphi 2005