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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2016, 15:33   #21
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию

Нашел где косяк был

Код:
type
  MyThread = class(TThread)
  private
    Rezult : integer;
  public

  protected - в этой строке
    procedure Execute; Override;
   constructor Create(CreateSuspended: Boolean); virtual;
   //  constructor Create; virtual;
    destructor Destroy; override;
    procedure  Threadfree;
    procedure Sync;
end;
Как я и предполагал, что в какой-то мелочевой строке косяк, спасибо за помощь, буду теперь чаще внимание на PROTECTED обращать =)
denis76560 вне форума Ответить с цитированием
Старый 16.12.2016, 15:35   #22
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Вот работа через сообщение объекта
Код:
unit Unit2;

interface

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

  type
  MyThread = class(TThread)
  private
    FOnResult: TNotifyEvent;
    FRezult : integer;
    protected
   procedure DoResult; virtual;
   procedure Threadfree; virtual;
  public
    procedure Execute; Override;
    constructor Create; virtual;
    destructor Destroy; override;
    property OnResult: TNotifyEvent read FOnResult write FOnResult;
    property Rezult: integer read FRezult write FRezult;
end;

implementation

constructor MyThread.Create;
begin
  inherited Create(false);
  FreeOnTerminate := True;
end;


destructor MyThread.Destroy;
begin
  Synchronize(Threadfree);
  inherited;
end;

procedure MyThread.Threadfree;
begin
Showmessage('Уничтожен');
end;

procedure MyThread.Execute;
begin
  Randomize;
Frezult:=RandomRange(0,456546);
Synchronize(DoResult);
 end;


procedure MyThread.DoResult;
begin
  if Assigned(FOnResult) then
    FOnResult(Self);
end;

end.
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    procedure OnResult(Sender: TObject);
  end;





 var
  Form1: TForm1;



{$R *.dfm}

implementation



procedure TForm1.Button1Click(Sender: TObject);
var
myThreadTmp: MyThread;
begin
myThreadTmp:=myThread.Create;
myThreadTmp.OnResult:= OnResult;
end;


procedure TForm1.OnResult(Sender: TObject);
begin
memo1.Lines.Add(IntToStr(MyThread(Sender).Rezult));
end;

end.
Я на этих потоках раньше сам запинался пока не усвоил много мелочей в них

Последний раз редактировалось Aliens_wolfs; 16.12.2016 в 16:50.
Aliens_wolfs вне форума Ответить с цитированием
Старый 16.12.2016, 15:38   #23
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию

О, классно, благодарю, теперь и поспать можно пойти, а то с 4х ночи сидел вникал где ошибка =)
denis76560 вне форума Ответить с цитированием
Старый 16.12.2016, 16:55   #24
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Цитата:
Как я и предполагал, что в какой-то мелочевой строке косяк, спасибо за помощь, буду теперь чаще внимание на PROTECTED обращать =)
Походу поток у тебя не завершался из-за того что не было объявлено
destructor Destroy; override;

а секции Protected, Public, Private это совсем другое не из-за этого

Можно еще сделать поток с ожиданием его завершения и по окончании получать результат

Код:
unit Unit2;

interface

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

  type
  MyThread = class(TThread)
  private
    FRezult : integer;
  Protected
   procedure Execute; Override;
   procedure Threadfree; virtual;
  public
    constructor Create; virtual;
   destructor Destroy; override;
    property Rezult: integer read FRezult write FRezult;
end;

implementation

uses
Unit1;

constructor MyThread.Create;
begin
  inherited Create(false);
  FreeOnTerminate := True;
end;


destructor MyThread.Destroy;
begin
  Synchronize(Threadfree);
  inherited;
end;

procedure MyThread.Threadfree;
begin
Showmessage(Уничтожен');
end;

procedure MyThread.Execute;
begin
 Randomize;
 Frezult:=RandomRange(0,456546);
 end;

end.
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public

  end;


 var
  Form1: TForm1;

{$R *.dfm}

implementation

procedure TForm1.Button1Click(Sender: TObject);
var
myThreadTmp: MyThread;
begin
myThreadTmp:=myThread.Create;
while myThreadTmp.Rezult = 0 do // Ждем пока результат будет больше 0
application.ProcessMessages;
memo1.Lines.Add(IntToStr(myThreadTmp.Rezult)); // Получаем результат
end;


end.

Последний раз редактировалось Aliens_wolfs; 16.12.2016 в 21:40.
Aliens_wolfs вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Утечка памяти [Освобождение памяти массива] denis76560 Общие вопросы Delphi 4 27.11.2016 18:20
Освобождение памяти после запуска TOpenDialog t2skler Общие вопросы Delphi 8 14.09.2011 02:19
Освобождение памяти после исключения Syuf Общие вопросы C/C++ 10 28.05.2011 12:28
Освобождение памяти VadEr Общие вопросы Delphi 2 17.04.2009 22:23
Освобождение памяти AlexandrSid Общие вопросы Delphi 3 02.02.2009 13:45