![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CD timeout [D6, Win2k, WinXP]
Delphi5.01 © (2003-12-07 11:31:00)Доброе время суток уважаемые программисты!
Проблема заключается в следующем, я пытаюсь прочитать определённый байт с компакт диска, эту операцию делает, "дочерний", отдельный поток, а главный поток который его создает проверяет прошло ли достаточно времени после чего надо прекратить считывание! Использую функцию:
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;
Надо сказать что эта процедура сама поток созданный программой!
Если кто может что ничуть посоветовать, пожалуйста помогите!
Спасибо за уделенное внимание.
AKul (2004-01-26 14:39:00) [1]
> Delphi5.01 © (07.12.03 11:31)
Что подразумевается под "зависанием"?
Скорее всего она постоянно крутится в цикле
while not SetTime do
Application.ProcessMessages;
А это возможно по следующей причине:
Первичный поток (т.е. программа) имеет приоритет Normal, и к тому же постоянно использует процессорное время(Application.ProcessMessages - не приостанавливает поток, а немедленно возвращает управление, если в очереди потока нет сообщений). В результате созданный поток, имеющий приоритет Idle, просто "голодает" процессорным временем и не в состоянии установить SetTime в true.
Выход: поставить новому потоку приоритет не ниже, чем у первичного.
Но лучше изменить структуру программы
Сашко (2004-01-26 13:58:00) [2]Я пробовал через потоки не получается,
если работать через процессы, то процесс прерывается, но сидюк
управление не передает, пока не закончит последнюю операцию.
Надо наверно использовать какое-то низкоуровневое прерывание(или через Драйвер)
Delphi5.01 (2003-12-07 17:18:00) [3]По моему проблемма или с потоком или устроиство забирает все процессорное время (испытания доказали что при ручной остановке, нажатием кнопки например, поток останавливается).
Жду советов!
Delphi5.01 (2003-12-07 13:32:00) [4]Как вижу очень сложный вопрос?!