Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


dracula ©   (2005-12-15 15:30:00) 

Мне надо при завершении потока 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;

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


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

Incompatible types: 'method pointer and regular procedure'

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

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

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


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

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 и поток аварийно завершается.


Leonid Troyanovsky   (2005-12-20 13:37:00) [3]


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


%delphi%\demos\threads\thrdDemo.dpr

--
Regards, LVT.


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

Так и не получилось у меня разобраться с 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.


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

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


Digitman   (2005-12-15 16:32:00) [6]


> Нафига


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


umbra   (2005-12-15 16:31:00) [7]

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

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


dracula   (2005-12-15 16:29:00) [8]

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


Digitman   (2005-12-15 16:26:00) [9]


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


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


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


?

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


dracula   (2005-12-15 16:24:00) [10]

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


Digitman   (2005-12-15 16:18:00) [11]


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


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


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

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


dracula   (2005-12-15 15:58:00) [12]

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


Digitman   (2005-12-15 15:56:00) [13]


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


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


dracula   (2005-12-15 15:50:00) [14]

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


Digitman   (2005-12-15 15:40:00) [15]


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


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

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


clickmaker   (2005-12-15 15:37:00) [16]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо