Текущий архив: 2005.01.09;
Скачать: CL | DM;
Вниз
TThread Найти похожие ветки
← →
ORMADA © (2004-12-22 11:39) [0]Доб день! Не пойму что за прикол может быть с Execute Thread при пошаговой отладке курсор начинает бегать не как обычно сверху вниз а бывает ни с того не с сего перелаетат на самое начало процедуры Execute. никаких goto нету...
← →
Digitman © (2004-12-22 11:56) [1]вполне нормальное явление, если создается и одновременно работает более чем один объект данного класса и в теле Execute вызываются Wait-ф-ции синхронизации из состава WinAPI, при вызове которых тек.трассируемый трэд переходит в т.н. "alertable wait state"
← →
ORMADA © (2004-12-22 13:03) [2]2 Digitman к сожалению создаётся всего 1 экземпляр такого типа...
не с чем это связано вчера перенёс часть кода из екзекута в основное тело всё работает отлично ничё не глючит , закоментировал
запустил опять тред всё работало нормально т.е. никаких самоволных переходов
сёдня опять тож самое...
← →
Digitman © (2004-12-22 13:07) [3]
> ORMADA © (22.12.04 13:03) [2]
чудес не бывает.
приводи полный код Execute()
← →
ORMADA © (2004-12-23 07:31) [4]вчера никак не мог зайти на портал
вот привожу
var
hSession: HINTERNET;
hUrl: HINTERNET;
Buffer: array[1..1024] of Byte;
Error: Boolean;
BufferLen: DWORD;
F: file;
ResumePos: WORD;
//DownloadSize: Integer;
dwBufferLen, dwIndex: DWORD;
dwBuffer: Pointer;
FileName: string;
begin
DownloadSize := 0;
ResumePos := 0; //Инициализируемся
FileName := ExtractFileDir(Application.ExeName) + "\Temp.tmp";
try
AssignFile(F, FileName); //Свяжемся с файлом
if FResume then
begin
if FileExists(FileName) then //Есть ли на диске этот файл
// Synchronize(OpenFileOnThread);
begin
Reset(f, 1); //Ах, есть? Откроем!
// Application.ProcessMessages;
ResumePos := FileSize(F); //Откуда докачать
DownloadSize := ResumePos;
Seek(F, FileSize(F)); //А писать бум в конец
end
end
else
Rewrite(f, 1); //А раз нет, так создадим
вот здесь к примеру скачет на самое начало...
if FUseProxy then
hSession := InternetOpen("FLoader", INTERNET_OPEN_TYPE_PROXY,
PAnsiChar(FProxyIP + ":" + FProxyPort), nil, 0)
else
hSession := InternetOpen("FLoader", INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
try
if not Assigned(hSession) then
begin
FExceptionMessage := ConectionError;
// Self.Terminate;
Exit;
end;
hUrl := InternetOpenUrl(hSession, PChar(FUrl), nil, 0, INTERNET_FLAG_RELOAD, 0);
try
if not Assigned(hUrl) then
begin
FExceptionMessage := ConectionError;
// Self.Terminate;
Exit;
end;
FProgress.Progress := ResumePos;
dwIndex := 0;
dwBufferLen := 20;
GetMem(dwBuffer, dwBufferLen);
try
if HttpQueryInfo(hURL, HTTP_QUERY_CONTENT_LENGTH, dwBuffer, dwBufferLen, dwIndex) then
FProgress.MaxValue := StrToInt(StrPas(dwBuffer));
finally
FreeMem(dwBuffer);
end;
if FProgress.MaxValue = 0 then
begin
FExceptionMessage := ConectionError;
// Self.Terminate;
Exit;
end;
//FStatusBar.Panels[0].Text := Format(DownloadProgressText, [ResumePos, FProgress.MaxValue]);
Synchronize(SetStatusBarText);
//FProgress.Show;
Application.ProcessMessages;
if ResumePos > 0 then //Если докачиваем,
InternetSetFilePointer(hURL, ResumePos, nil, 0, 0); //То сместимся
repeat //Качаем
BufferLen := 0;
Error := InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
//Читаем буфер
if not Error then //Ошибка чтения
begin
FExceptionMessage := Exception(ExceptObject).Message;
Self.Terminate;
Exit;
end;
if BufferLen <> 0 then
begin
BlockWrite(f, Buffer, BufferLen); //Пишем в файл
DownloadSize := DownloadSize + Integer(BufferLen);
Synchronize(SetStatusBarText);
//!!!FStatusBar.Panels[0].Text := Format(DownloadProgressText, [DownloadSize, FProgress.MaxValue]);
FProgress.Progress := DownloadSize;
Application.ProcessMessages;
end;
if DownloadSize = FProgress.MaxValue then
Break;
until (BufferLen = 0) or (Self.Terminated);
//Качаем, пока не terminate или надо
finally
InternetCloseHandle(hUrl);
end;
finally
InternetCloseHandle(hSession);
CloseFile(f);
if DownloadSize = FProgress.MaxValue then
begin
if FileCopy(FileName, FFileName) then
DeleteFile(FileName);
end;
FProgress.Hide;
Application.ProcessMessages;
end;
finally
if FileExists(FileName) then
DeleteFile(FileName);
//Self.Terminate;
end;
← →
Digitman © (2004-12-23 08:16) [5]э-э-э, батенька) ..
так дело не пойдет.
во-первых, недопустимо обращаться к VCL-объектам из доп.трэда без синхронизации с основным
во-вторых, Application.ProcessMessages, вызываемый в данном контексте - нонсенс
← →
ORMADA © (2004-12-23 08:34) [6]дык вроде ж заменил
//FStatusBar.Panels[0].Text := Format(DownloadProgressText, [ResumePos, FProgress.MaxValue]);
на Synchronize(SetStatusBarText);
вроде больше VCL нету
про Application.ProcessMessages не знал
а ведь в этом блоке
DownloadSize := 0;
ResumePos := 0; //Инициализируемся
FileName := ExtractFileDir(Application.ExeName) + "\Temp.tmp";
try
AssignFile(F, FileName); //Свяжемся с файлом
if FResume then
begin
if FileExists(FileName) then //Есть ли на диске этот файл
// Synchronize(OpenFileOnThread);
begin
Reset(f, 1); //Ах, есть? Откроем!
// Application.ProcessMessages;
ResumePos := FileSize(F); //Откуда докачать
DownloadSize := ResumePos;
Seek(F, FileSize(F)); //А писать бум в конец
end
end
else
Rewrite(f, 1); //А раз нет, так создадим
нет обращения к VCL
если что-то неправильно написано подскажи что конкретно плз.. буду благодарен ...
← →
Digitman © (2004-12-23 09:10) [7]
> а ведь в этом блоке
> нет обращения к VCL
зато в других есть
убери все обращения к Application, а также убери или синхронизируй обращения к ProgressBar
> Self.Terminate
убери Self, он здесь не нужен
> Rewrite(f, 1); //А раз нет, так создадим
> вот здесь к примеру скачет на самое начало...
а если эта строчка возбудит исключение по какой-то причине ? ты же его никак не перехватываешь и не обрабатываешь ..
> Error := InternetReadFile(hURL, @Buffer, SizeOf(Buffer),
> BufferLen);
> //Читаем буфер
> if not Error then //Ошибка чтения
> begin
> FExceptionMessage := Exception(ExceptObject).Message;
откуда исключение-то возьмется тут ? если ф-ция InternetReadFile() вернула управление (неважно с каким кодом возврата - ошибки или успеха), то ExceptObject = nil (объект-исключение не существует), и как только ты обратишься к несуществующему объекту, тут же получишь AV-исключение, которое ты опять же никак не перехватываешь и не обрабатываешь
советую хотя бы в целях отладки заключить весь код тела метода Execute в блок try..except, например, вот так :
try
.. чего-то там
except
on e:exception do
MessageBox(0, PChar(e.ClassName + " " + e.Message), "Непредвиденная исключительная ситуация", mb_ok or mb_setforeground);
end;
← →
ORMADA © (2004-12-23 13:18) [8]2 Digitman спасибо , понял ...
Страницы: 1 вся ветка
Текущий архив: 2005.01.09;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.029 c