Главная страница
    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.133 c
1-1118472025
klass
2005-06-11 10:40
2005.07.11
Как устовить плноценный сервис Service Application ?


14-1118244161
WondeRu
2005-06-08 19:22
2005.07.11
Зачем нужен КПК?


4-1115708906
TriboSM
2005-05-10 11:08
2005.07.11
Получить заголовок документа в спулере печати


1-1119427254
mariya_mezenceva
2005-06-22 12:00
2005.07.11
ошибка при работе с excel из потока


3-1117083371
Iova
2005-05-26 08:56
2005.07.11
Можно ли какнибудь избавться от связей?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский