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

Вниз

CD timeout   Найти похожие ветки 

 
Delphi5.01 ©   (2003-12-07 11:31) [0]

Доброе время суток уважаемые программисты!
Проблема заключается в следующем, я пытаюсь прочитать определённый байт с компакт диска, эту операцию делает, "дочерний", отдельный поток, а главный поток который его создает проверяет прошло ли достаточно времени после чего надо прекратить считывание! Использую функцию:

 WorkDone:=ReadFile(IFile.Handle,Buffer,BufferSize,RealBufferSize,nil);

к сожалению при создании "дочернего" потока, главный поток зависает (не смотря на то что у "дочернего потока выставлено Priority:=tpIdle").
Ниже приведен код в сокращении:

procedure TSaver.DoWork;
begin
 Done:=False;
 Time:=GetTickCount;
 SetTime:=True;
 WorkDone:=ReadFile(IFile.Handle,Buffer,BufferSize,RealBufferSize,nil);
 Done:=True;
end;

procedure TSaver.Execute;
begin
 DoWork;
end;

Главная процедура
procedure TDownload.Work;
 var ...
     Get: TSaver;
     TimeOut: Integer;
begin
 ...
 Get:=TSaver.Create(True);
 Get.Priority:=tpIdle;
 Get.FreeOnTerminate:=True;
 Get.Resume;
//ожидаю когда поток возьмет значение Time
while not SetTime do
  Application.ProcessMessages;
//жду до истечения времени или байт прочитан
while (GetTickCount-Time<TimeOut)and(Not Done) do
   Application.ProcessMessages;
//восстанавливаю значения
 SetTime:=False;  
//если произошло "таймаут"
if Not Done then
  begin
     Get.Suspend;
     Get.Terminate;
  end;
 ...
end;


Надо сказать что эта процедура сама поток созданный программой!
Если кто может что ничуть посоветовать, пожалуйста помогите!
Спасибо за уделенное внимание.


 
Delphi5.01 ©   (2003-12-07 13:32) [1]

Как вижу очень сложный вопрос?!


 
Delphi5.01 ©   (2003-12-07 17:18) [2]

По моему проблемма или с потоком или устроиство забирает все процессорное время (испытания доказали что при ручной остановке, нажатием кнопки например, поток останавливается).
Жду советов!


 
Сашко   (2004-01-26 13:58) [3]

Я пробовал через потоки не получается,
если работать через процессы, то процесс прерывается, но сидюк
управление не передает, пока не закончит последнюю операцию.
Надо наверно использовать какое-то низкоуровневое прерывание(или через Драйвер)


 
AKul ©   (2004-01-26 14:39) [4]


> Delphi5.01 ©   (07.12.03 11:31)  

Что подразумевается под "зависанием"?
Скорее всего она постоянно крутится в цикле
while not SetTime do
 Application.ProcessMessages;

А это возможно по следующей причине:
Первичный поток (т.е. программа) имеет приоритет Normal, и к тому же постоянно использует процессорное время (Application.ProcessMessages - не приостанавливает поток, а немедленно возвращает управление, если в очереди потока нет сообщений). В результате созданный поток, имеющий приоритет Idle, просто "голодает" процессорным временем и не в состоянии установить SetTime в true.
Выход: поставить новому потоку приоритет не ниже, чем у первичного.
Но лучше изменить структуру программы



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

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

Наверх




Память: 0.48 MB
Время: 0.023 c
1-1079337875
Leech
2004-03-15 11:04
2004.04.04
Архивирование данных


1-1078941592
Raids
2004-03-10 20:59
2004.04.04
QuickReport не правильно считает по группам


8-1070116462
Bucha Victor
2003-11-29 17:34
2004.04.04
Чудеса с палитрой


14-1078516456
syte_ser78
2004-03-05 22:54
2004.04.04
Блин, ну что, никто не знает?


14-1078998347
Vovchik_A
2004-03-11 12:45
2004.04.04
Потеря...