Текущий архив: 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.45 MB
Время: 0.038 c