Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
1-1079626166
Kor@l
2004-03-18 19:09
2004.04.04
mouse and RButton


11-1058571270
LambdA
2003-07-19 03:34
2004.04.04
Где аналог StrToFloat и FloatToStr?


3-1078559198
STAR-BOY-F
2004-03-06 10:46
2004.04.04
MySQL и DELPHI 3


8-1070360127
chi
2003-12-02 13:15
2004.04.04
GDI


14-1078429319
zzet
2004-03-04 22:41
2004.04.04
Помогите в борьбе со спамом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский