Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.032 c
4-1100691761
fester
2004-11-17 14:42
2005.01.09
Процесс запуска EXE-файла


1-1103808207
Alek
2004-12-23 16:23
2005.01.09
Работа с длл


3-1102480164
_sulent
2004-12-08 07:29
2005.01.09
Genereal SQL error


1-1103551001
Aleksandr.
2004-12-20 16:56
2005.01.09
Не понимаю, почему Tabs у PageControl неправильно отрисовываются!


3-1102482943
self001
2004-12-08 08:15
2005.01.09
выделить цветом поле в dbgrid





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский