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

Вниз

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

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

Наверх





Память: 0.5 MB
Время: 0.035 c
2-1137161449
sanich
2006-01-13 17:10
2006.01.29
Что могла бы значить подобная ошибка?


15-1136395388
ArtemESC
2006-01-04 20:23
2006.01.29
Внедрение в Explorer-ы


1-1135074479
leonidus
2005-12-20 13:27
2006.01.29
Как в моей программе просмативать документы Word`а?


2-1137041866
maep
2006-01-12 07:57
2006.01.29
Поиск среди тьмы тьмущей данных, контейнеры..


5-1121963796
capkoh
2005-07-21 20:36
2006.01.29
Выпадающий список ComboBox





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