Главная страница
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.036 c
1-1079463081
Magisimus
2004-03-16 21:51
2004.04.04
Вопрос ко всем, как можно узнать размер папки?


7-1074238356
Serge
2004-01-16 10:32
2004.04.04
Disable Start menu on descktop doubleclik


14-1078437695
_none_
2004-03-05 01:01
2004.04.04
а что если написать вирус для борьбы со спамом?


7-1074239041
Max_222
2004-01-16 10:44
2004.04.04
Как лучше заблокировать txt-файл...


1-1079546847
Chcnger
2004-03-17 21:07
2004.04.04
Опять факториал