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

Вниз

Помогите разобраться с завершением потока.   Найти похожие ветки 

 
dracula ©   (2005-12-15 15:30) [0]

Мне надо при завершении потока execute.OnTerminate присвоить status : boolean  значение false  но я незнаю как это сделать

Создаю поток
 execute := copier.Create(false);
 execute.Priority := tpLowest;
 execute.OnTerminate := ThreadTerminated;
Делаю процедуру
private
   procedure ThreadTerminated(Sender: TObject);

procedure ThreadTerminated(Sender: TObject);
begin
status := false;
end;

Ну и нифига невыходит, как мне это правильно сдлать?
Заранее спасибо.


 
clickmaker ©   (2005-12-15 15:37) [1]

в отладчике посмотри


 
Digitman ©   (2005-12-15 15:40) [2]


> нифига невыходит


чтобы что-то вышло, надо чтобы это самое "что-то" сначала вошло)

а оно не входит хотя бы по той причине , что в твоем коде ThreadTerminated() с какого-то перепугу описана как рег.процедура, а не как метод класса


 
dracula ©   (2005-12-15 15:50) [3]

Я понял, что делаю неправильно, поэтому и прошу помощи. Можно маленький примерчик.


 
Digitman ©   (2005-12-15 15:56) [4]


> dracula ©   (15.12.05 15:50) [3]


разницу между регулярной процедурой и процедурным методом класса понимаешь ?


 
dracula ©   (2005-12-15 15:58) [5]

ну допустим я представляю что это, может несовсем точно, но...


 
Digitman ©   (2005-12-15 16:18) [6]


> dracula ©   (15.12.05 15:58) [5]


> допустим я представляю


тогда рассказывай, как ты себе это представляешь ..

а мы подправим, если что не так ..


 
dracula ©   (2005-12-15 16:24) [7]

Ну ладно хватит издеватся, лучше делом помоги. Мне хоть какой пример, дальше я сам разберусь. Просто первый раз с таким делом столкнулся, а как сделать пока незнаю, один раз увидеть и хоть знать на потом буду что к чему, и не буду глупых вопросов задавать.


 
Digitman ©   (2005-12-15 16:26) [8]


> хватит издеватся


а ты, надо понимать, не издеваешься ?


> нифига невыходит


?

ляпнул и сидишь в потолок поплевываешь,  телепатов ждешь ) ...


 
dracula ©   (2005-12-15 16:29) [9]

Нафига отвечать тогда, если только и можешь что под....вать.


 
umbra ©   (2005-12-15 16:31) [10]

2 dracula ©   (15.12.05 16:29) [9]

если бы Вы ответили на заданный вопрос, то сами бы поняли, где у Вас ошибка


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


> Нафига


если ты в результате чуть-чуть научишься думать самостоятельно, то, считай, я день прожил не зря)


 
dracula ©   (2005-12-15 16:43) [12]

Я могу разобратся самостоятельно, но у меня на это уйдёт много времени (точнее уже ушло), а на простом примере я разобрался бы намного быстрее. Ладно продолжу поиски самостоятельно, извини если обидел чем. Спасибо за помощь - хоть и небольшую, но всётаки =)


 
dracula ©   (2005-12-20 13:18) [13]

Так и не получилось у меня разобраться с OnTerminate, Во всех примерах которые я находил всё строится таким образом как в коде ниже, но у меня компилятор выдаёт ошибку, что несовместимые типы и т.д. ...

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TPrimeFrm = class(TForm)
NumEdit: TEdit;
SpawnButton: TButton;
ResultsMemo: TMemo;
procedure SpawnButtonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
FThreadRefCount: integer;
procedure HandleTerminate(Sender: TObject);
public
{ Public declarations }
end;

var
PrimeFrm: TPrimeFrm;

implementation

uses PrimeThread;

{$R *.DFM}

procedure TPrimeFrm.SpawnButtonClick(Sender: TObject);

var
NewThread: TPrimeThrd;

begin
NewThread := TPrimeThrd.Create(True);
NewThread.FreeOnTerminate := True;
try
with NewThread do
begin
TestNumber := StrToInt(NumEdit.Text);
Inc(FThreadRefCount);
OnTerminate := HandleTerminate;
Resume;
end;
except on EConvertError do
begin
NewThread.Free;
ShowMessage("That is not a valid number!");
end;
end;
end;

procedure TPrimeFrm.FormCreate(Sender: TObject);
begin
FThreadRefCount := 0;
end;

procedure TPrimeFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := true;
if FThreadRefCount > 0 then
begin
if MessageDlg("Threads active. Do you still want to quit?",
mtWarning, [mbYes, mbNo], 0) = mrNo then
CanClose := false;
end;
end;

procedure TPrimeFrm.HandleTerminate(Sender: TObject);
begin
Dec(FThreadRefCount);
end;

end.


В учебниках которые я просмотрел, авторы обходят этот вопрос стороной, и в итоге мне всётаки нужна помощь. Как при завершении потока присвоить переменной true.


 
Leonid Troyanovsky ©   (2005-12-20 13:37) [14]


> dracula ©   (20.12.05 13:18) [13]
> Так и не получилось у меня разобраться с OnTerminate, Во


%delphi%\demos\threads\thrdDemo.dpr

--
Regards, LVT.


 
Alexander Panov ©   (2005-12-20 15:30) [15]

dracula ©   (20.12.05 13:18) [13]

Вот так прекрасно все работает:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type

 TTestThread=class(TThread)
 protected
   procedure Execute; override;
 end;

 TForm1 = class(TForm)
   Button1: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
 public
   procedure ThreadTerminate(Sender: TObject);

 end;

var
 Form1: TForm1;
 F: TForm;
 Counter: Integer;

implementation

{$R *.dfm}

procedure TForm1.ThreadTerminate(Sender: TObject);
begin
 Dec(Counter);
 Memo1.Lines.Add(IntToStr(Counter));
end;

{ TTestThread }

procedure TTestThread.Execute;
begin
 Sleep(1000);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 with TTestThread.Create(True) do
 begin
   FreeOnTerminate := True;
   OnTerminate := ThreadTerminate;
   Inc(Counter);
   Memo1.Lines.Add(IntToStr(Counter));
   Resume;
 end;
end;

end.


А у тебя, похоже, ошибка в поточной процедуре. В ней возникает Exception и поток аварийно завершается.


 
dracula ©   (2005-12-20 16:32) [16]

Incompatible types: "method pointer and regular procedure"

Выдаёт вот такую ошибку. Вроде делаю всё также, но...
>Alexander Panov твой код работает, а мой нехочет =(

У меня поток реализован в отдельном юните,

Допустим при нажатии на кнопку я создаю поток
execute := copier.Create(false);
execute.Priority := tpLowest;
execute.OnTerminate := ThreadTerminate;</CODE> выдаёт ошибку при компиляции, ошибка вверху.



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

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

Наверх




Память: 0.51 MB
Время: 0.048 c
2-1137154318
ASMSoft
2006-01-13 15:11
2006.01.29
РАДАР


2-1137261934
Vovik
2006-01-14 21:05
2006.01.29
кодировки


2-1137032664
Kromwerk
2006-01-12 05:24
2006.01.29
Стиль Windows XP в приложении


15-1135593524
psa247
2005-12-26 13:38
2006.01.29
Error open *.dfm !


15-1136379634
lookin
2006-01-04 16:00
2006.01.29
Напомните плз, как восстановить в Win2k только что удаленный файл