Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

Как правильно организовать задержку при обращении к 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.04 c
11-1101489029
Alexandr999
2004-11-26 20:10
2005.07.11
Undeclared identifier: Application


1-1119358489
intaari
2005-06-21 16:54
2005.07.11
Прога не находит класс при старте программы


14-1118046634
syte_ser78
2005-06-06 12:30
2005.07.11
дырка в плите


14-1118129757
Nikolay M.
2005-06-07 11:35
2005.07.11
В продолжение темы о шашлыках под Черноголовкой


3-1117000070
Гость2
2005-05-25 09:47
2005.07.11
Как вставить переменную в SQL-запрос?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский