Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.07;
Скачать: CL | DM;

Вниз

Потоки TTread   Найти похожие ветки 

 
Helen   (2005-07-15 10:00) [0]

Добрый день! Помогите, пожалуйста разобраться новичку! Только начинаю работать с потоками. Создаю поток, по клику на кнопку он должен прерваться, т.е. MyThread.Terminate. Причем должно выполниться событие OnTerminate, в котором кое-какие действия с VCL-компонентами. Почему-то событие не наступает, а поток продолжает выполняться после некоторой задержки.


 
Чапаев ©   (2005-07-15 10:05) [1]

Посмтри примеры. У тебя в основном цикле должно быть что-то вроде while not Thread.Terminated do Work;


 
Alexander Panov ©   (2005-07-15 10:06) [2]

Чапаев ©   (15.07.05 10:05) [1]
Ну ты телепат!


 
Helen   (2005-07-15 10:09) [3]

Чапаев ©   (15.07.05 10:05) [1]
Да нет, ничего такого у меня нет.


 
Kolan ©   (2005-07-15 10:12) [4]


> Helen   (15.07.05 10:00)  

С VCL компонентами должен работать главный поток.
Дальше без кода говорить неочем..


 
Digitman ©   (2005-07-15 10:17) [5]


> ничего такого у меня нет


поточная ф-ция должна каким-то образом быть извещена о необходимости "закругляться по хозяйству"

периодическая (как можно чаще) проверка  выполнения условия Terminated=True как вариант позволяет получить такое "извещение"

метод TThread.Terminate просто устанавливает этот флаг, не более того


 
Digitman ©   (2005-07-15 10:18) [6]


> Kolan ©   (15.07.05 10:12) [4]


по дифолту вызов обработчика OnTerminate уже синхронизирован


 
Helen   (2005-07-15 10:39) [7]

Дело в том, что по мере выполнения потока, он выдает в Memo некоторые сообщения о ходе выполнения. По событию OnTerminate в Memo добавляются несколько строк и др.

Создаю поток:

   ThreadLoadManual:=TMainThread.Create(True);
   ThreadLoadManual.Priority:=tpLowest;
   ThreadLoadManual.OnTerminate:=HandleTerminateManual;
   ThreadLoadManual.FreeOnTerminate:=True;
   ThreadLoadManual.Resume;


Событие OnTerminate:

procedure TfmLoadData.HandleTerminateManual(Sender:TObject);
begin
   CloseFile(ProgressFile);
   fmLoadData.Memo1.Lines.Add("...");
   fmLoadData.btnStatistica.Enabled:=True;
   fmLoadData.Height:=495;
   fmLoadData.rgStatistica.Enabled:=True;
end;


 
Helen   (2005-07-15 10:42) [8]

Digitman ©   (15.07.05 10:17) [5]
Попробовала поставить проверку  выполнения условия Terminated=True, почему-то она игнорируются и поток выполняется дальше


 
Digitman ©   (2005-07-15 10:43) [9]


> Helen   (15.07.05 10:39) [7]


это все - вокруг да около.
самое интересное - это тело Execute() ..


 
Helen   (2005-07-15 10:58) [10]

   
   fmLoadData.Memo1.Lines.Add("  * * *");

   {$I-}
   AssignFile(ProgressFile, ExtractFilePath(Application.ExeName)+"ñòàòèñòèêà çàãðóçêè.txt");
   if not FileExists(ExtractFilePath(Application.ExeName)+"ñòàòèñòèêà çàãðóçêè.txt") then Rewrite(ProgressFile)
       else Append(ProgressFile);
   IOResult;
   {$I+}
   Writeln(ProgressFile," ");

   Data.qrTemp.Open;

   DataFile:="St"+stD+stM+RightStr(stY,2)+".dbf";

   while not Data.qrTemp.Eof and (not Terminated) do begin
       fmLoadData.Memo1.Lines.Add("Íà÷àëî çàãðóçêè äàííûõ ïî ñòàíöèè "+Data.qrTemp.FieldByName("Name").AsString);;
     
       NetResource.dwType:= RESOURCETYPE_DISK;
       NetResource.lpLocalName:= nil;
       NetResource.lpRemoteName:= Pchar(Data.qrTemp.FieldByName("IPStation").AsString);
       NetResource.lpProvider   := "";
       if (WNetAddConnection2(NetResource,
           PChar(Data.qrTemp.FieldByName("Password").AsString),
           PChar(Data.qrTemp.FieldByName("Login").AsString),
           0) = NO_ERROR)
       then begin
           DatabaseName:= Data.qrTemp.FieldByName("IPStation").AsString;

           if not FileExists(DatabaseName+"\"+DataFile)
           then begin
               Writeln(ProgressFile, DateTimeToStr(Now()) + ":00:00 "+Data.qrTemp.FieldByName("Name").AsString+" Äàííûå íå çàãðóæåíû, ò.ê. íå íàéäåí ôàéë ñ äàííûìè "+DatabaseName+"\"+DataFile+"!");
               WNetCancelConnection2(Pchar(Data.qrTemp.FieldByName("IPStation").AsString), 0,TRUE);
               Data.qrTemp.Next;
               Continue;
           end;

           for i:=HourB to HourE do begin
               запрос данных
               while not Data.QueryDBF.Eof and (not Terminated) do
               begin
                   преобразование и запись данных в базу
               end;
           end;

           end;//for i:=HourB to HourE do

           WNetCancelConnection2(Pchar(Data.qrTemp.FieldByName("IPStation").AsString), 0,TRUE);
           Writeln(ProgressFile, DateTimeToStr(Now()) + ":00:00  "+Data.qrTemp.FieldByName("Name").AsString+" Äàííûå ñòàòèñòèêè çàãðóæåíû!");
           fmLoadData.Memo1.Lines.Add(Data.qrTemp.FieldByName("Name").AsString+": Äàííûå ñòàòèñòèêè çàãðóæåíû!");

       end else begin
           fmLoadData.Memo1.Lines.Add("  "+SysErrorMessage(GetLastError)+":"+Data.qrTemp.FieldByName("Name").AsString);
           Writeln(ProgressFile, DateTimeToStr(Now()) + ":00:00 "+Data.qrTemp.FieldByName("Name").AsString+" Äàííûå íå çàãðóæåíû, ò.ê. íå ìîãó ïîäêëþ÷èòü ñåòåâîé ðåñóðñ "+Data.qrTemp.FieldByName("IPStation").AsString+"!");
       end; // åñëè ñìîãëè ïîäêëþ÷èòü ñåòåâîé ðåñóðñ
       Data.qrTemp.Next;
   end; // while not Data.qrTemp.Eof do


 
Digitman ©   (2005-07-15 11:16) [11]

у тебя в теле Execute() возникает необработанное исключение

возникает оно здесь - fmLoadData.Memo1.Lines.Add() - и связано с попыткой обращения к виз.VCL-контролу в контексте неосновного потока, что недопустимо

см. метод Synchronize()



Страницы: 1 вся ветка

Текущий архив: 2005.08.07;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.048 c
1-1121714343
BBCHa
2005-07-18 23:19
2005.08.07
Заголовок дочерней формы в TaskBare


14-1120578423
NewWonder
2005-07-05 19:47
2005.08.07
Сделал курсовик и ...


1-1121770761
td
2005-07-19 14:59
2005.08.07
как скопировать текст из нескольких текстовых файлов в один?


14-1121748060
lookin
2005-07-19 08:41
2005.08.07
Помогите перевести фразу...


1-1121323132
Erik1
2005-07-14 10:38
2005.08.07
Правильное ожидание для завершения потока?