Главная страница
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.042 c
3-1078819320
denik
2004-03-09 11:02
2004.04.04
Каким образом выйти из режима редактирования?


3-1078651599
Masha Streltsova
2004-03-07 12:26
2004.04.04
Ни как не получается вставить долбанный ComboBox в DBGrid


14-1079005085
KSergey
2004-03-11 14:38
2004.04.04
По поводу .NET и ее перспективности


1-1079101765
}|{yk
2004-03-12 17:29
2004.04.04
Хорошо, посылаю я сообщение другому приложению BroadcastSystemMes


1-1079283255
Andy BitOff
2004-03-14 19:54
2004.04.04
Коммандная строка и/или не запуск второй копии.