Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2009, 21:02   #1
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
Вопрос Уничтожение потока

Товарищи я не могу его методом Terminate из-за того того, что объявил Public???

Код:
unit Unit3;

interface

uses
  Classes, Graphics;

type
  TRandomizeMolekulsThread = class(TThread)
  private
    b:TBitmap;
    procedure DrawMolekuls;
  public
    h:integer;
    m:double;
    T:integer;
    Width,Heigth:Integer;
    nh:integer;
  protected
    procedure Execute; override;
  end;

const
  n0=50;
  k=1.38E-23;
  g=9.8;

implementation

uses Math, Unit2, SysUtils;

{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure TRandomizeMolekulsThread.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ TRandomizeMolekulsThread }

var b:TBitmap;
    h:integer;
    m:double;
    T:integer;
    Width,Heigth:Integer;
    nh:integer;
procedure TRandomizeMolekulsThread.DrawMolekuls;
begin
  WorkForm.MolekulsImage.Picture.Bitmap.Canvas.Refresh;
  WorkForm.MolekulsImage.Picture.Bitmap.Canvas.Draw(0,0,b);
  WorkForm.MolekulzCountedit.Text:=IntToStr(nh);
end;

procedure TRandomizeMolekulsThread.Execute;
var
  i, X, Y:Integer;
begin
  FreeOnTerminate:=true;
  Randomize;
  while not Terminated do
  begin
    Randomize;
    b:=nil;
    b:=TBitmap.create;
    b.Width:=Width; b.Height:=Heigth;
    b.Canvas.Brush.Color:=clBlack;
    nh:=round(n0*exp(-m*g*h/k/T)*(90+Random(20))/100);
    for i:=1 to nh do
    begin
      X:=Random(b.Width-4);
      y:=Random(b.Height-4);
      b.Canvas.Ellipse(x-2,y-2,x+2,y+2);
    end;
    Synchronize(DrawMolekuls);
    b.Free;
    Sleep(100);
  end;
end;

end.
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 11.02.2009, 21:33   #2
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Цитата:
Сообщение от SNUPY Посмотреть сообщение
var b:TBitmap;
h:integer;
mouble;
T:integer;
Width,Heigth:Integer;
nh:integer;
А зачем объявлены переменные с такими же именами, что и поля класса? Ты уверен, что идет работа с нужными переменными?

И еще, вызывать FreeOnTerminate:=true; лучше при создании потока. И лучше не вызывать слишком часто (в цикле) Randomize
Jeni вне форума Ответить с цитированием
Старый 11.02.2009, 22:47   #3
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Код:
А зачем объявлены переменные с такими же именами, что и поля класса?
Действительно зачем? а я и не заметил =\

Черт я вообще не в катываю =\.... Почему я не могу его приравнять nil =\
Код:
unit Unit3;

interface

uses
  Classes, Graphics;

type
  TRandomizeMolekulsThread = class(TThread)
  private
    procedure DrawMolekuls;
  protected
    procedure Execute; override;
  end;

const
  n0=50;
  k=1.38E-23;
  g=9.8;

var
  b:TBitmap;
  h:integer;
  m:double;
  T:integer;
  Width,Heigth:Integer;
  nh:integer;

implementation

uses Math, Unit2, SysUtils;

{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure TRandomizeMolekulsThread.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ TRandomizeMolekulsThread }

//var //b:TBitmap;
    //h:integer;
   // m:double;
    //T:integer;
    //Width,Heigth:Integer;
    //nh:integer;
procedure TRandomizeMolekulsThread.DrawMolekuls;
begin
  WorkForm.MolekulsImage.Picture.Bitmap.Canvas.Refresh;
  WorkForm.MolekulsImage.Picture.Bitmap.Canvas.Draw(0,0,b);
  WorkForm.MolekulzCountedit.Text:=IntToStr(nh);
end;

procedure TRandomizeMolekulsThread.Execute;
var
  i, X, Y:Integer;
begin
  Randomize;
  h:=WorkForm.Thh;
  m:=WorkForm.Thm;
  T:=WorkForm.Tht;
  Width:=WorkForm.ThBWidth;
  Heigth:=WorkForm.ThBHeigth;
  while not Terminated do
  begin
    b:=nil;
    b:=TBitmap.create;
    b.Width:=Width; b.Height:=Heigth;
    b.Canvas.Brush.Color:=clBlack;
    nh:=round(n0*exp(-m*g*h/k/T)*(90+Random(20))/100);
    for i:=1 to nh do
    begin
      X:=Random(b.Width-4);
      y:=Random(b.Height-4);
      b.Canvas.Ellipse(x-2,y-2,x+2,y+2);
    end;
    Synchronize(DrawMolekuls);
    b.Free;
    Sleep(100);
  end;
  b:=nil;
end;

end.
Вроде бы создаю так:
Код:
procedure TWorkForm.CreateMolekulzThread;
begin
  DrawMolekulsThread:=TRandomizeMolekulsThread.create(true);

  with DrawMolekulsThread do
  begin
    FreeOnTerminate:=true;
    Thh:=StrToInt(HEdit.text);
    ThT:=StrToInt(TemperatureEdit.text);
    if MComboBox.ItemIndex>=0 then
    begin
      Thm:=MStrtofloat(MComboBox.Items[MComboBox.ItemIndex]);
    end else Thm:=0;
  end;
  ThBWidth:=MolekulsImage.Width;
  ThBHeigth:=MolekulsImage.Height;
end;
А во время дебага после данной строки он должен быть равен nil:
Код:
DrawMolekulsThread.Terminate;
Помог? Ну так нажми на весы!

Последний раз редактировалось Stilet; 12.02.2009 в 11:19.
SNUPY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматическое уничтожение объекта mutabor Общие вопросы Delphi 6 25.06.2008 22:25
Создание/уничтожение объектов nimf Общие вопросы Delphi 10 14.04.2008 10:54
Уничтожение окна Kashp Win Api 20 07.09.2007 14:15