Помогите новичку вызвать поток.
От: balykovdron Россия  
Дата: 12.04.03 08:21
Оценка:
Что я делаю не так? При заходе в конструктор потока
сообщение выскакивает, но следующая команда приводит к
"Access violation..."

Подробности вот:
1. File\New\Application
2. Кинул кнопку на форму
3. код формы
------------------------------
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Unit2;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  end;
var
  Form1: TForm1;
  CopyThread: TCopyThread;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
  CopyThread.Create(False);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if not (CopyThread = nil) then begin
      CopyThread.Terminate;
  end;
end;
end.
------------------------------
4. Добавил еще один модуль (Unit2)
вот код модуля
------------------------------
unit Unit2;
interface
uses
  Classes, Dialogs, Windows;
type
  TCopyThread = class(TThread)
  protected
    procedure Execute; override;
  public
    constructor Create(S: String);
    destructor Destroy; override;
  end;
implementation
constructor TCopyThread.Create(S: String);
begin
  showmessage(S);
  inherited Create(False);
end;
destructor TCopyThread.Destroy;
begin
  inherited Destroy;
end;
procedure TCopyThread.Execute;
begin
  sleep(1000);
end;
end.

------------------------------
Re: Помогите новичку вызвать поток.
От: Sinclair Россия https://github.com/evilguest/
Дата: 12.04.03 08:50
Оценка: +1
Здравствуйте, balykovdron, Вы писали:


procedure TForm1.Button1Click(Sender: TObject);
begin
  CopyThread:= TCopyThread.Create('TestString');
end;
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Помогите новичку вызвать поток.
От: balykovdron Россия  
Дата: 12.04.03 11:16
Оценка:
S>
S>procedure TForm1.Button1Click(Sender: TObject);
S>begin
S>  CopyThread:= TCopyThread.Create('TestString');
S>end;
S>


Это просто описался — конечно так тоже не работает...
Я же говорю. В конструктор заходит нормально, а потом
inherited Create(False); — выполнить не может
Re[2]: Отбой !!!
От: balykovdron Россия  
Дата: 12.04.03 11:33
Оценка:
Здравствуйте, Sinclair, Вы писали:
S>
S>procedure TForm1.Button1Click(Sender: TObject);
S>begin
S>  CopyThread:= TCopyThread.Create('TestString');
S>end;
S>


Все правильно! Заработало! Спасибо.
Re[3]: Помогите новичку вызвать поток.
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.04.03 07:03
Оценка:
Здравствуйте, balykovdron, Вы писали:

B>Это просто описался — конечно так тоже не работает...

B>Я же говорю. В конструктор заходит нормально, а потом
B>inherited Create(False); — выполнить не может
Э, нет товарищь. В твоем варианте вызов конструктора происходит на неинициализированном указателе. Надо присваивание не пропустить! Вот поставь брекпоинт в начале своего конструктора, и посмотри значение выражения "@self". Нулю оно у тебя равно!
Внимательно смотри в тот код, который я выделил жирным.
... << RSDN@Home 1.0 beta 6 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.