Форум: "Основная";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];
ВнизПотоки 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.031 c