Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.409 c
14-1103251722
Думкин
2004-12-17 05:48
2005.01.09
С днем рождения! 17 декабря


14-1103541588
vajo
2004-12-20 14:19
2005.01.09
Сертификат соответствия


1-1103618080
paule
2004-12-21 11:34
2005.01.09
Проблема с переменной


4-1100703681
Alexey Romanskiy
2004-11-17 18:01
2005.01.09
Убрать регулятор звука из трея


6-1098117504
L.evil
2004-10-18 20:38
2005.01.09
Indy