Форум: "Система";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.031 c