スレッドについて


ギャッツビー  2005-07-08 21:29:56  No: 16262

あらかじめ作成しているグローバルの文字列リスト(MList)に
データを入れておいて、これをスレッドに渡して ShowMessage で
表示したいのですがうまくいきません。
どこが悪いのでしょうか?また、どうすればよいのか教えてください。

フォームを2つ用意します。
1つめにはボタンを貼り付けます。
以下ソースコードになります

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Unit1
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
  public
  end;

var
  Form1:  TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  MList := TStringList.Create;
  MList.Add('abc-def');
  MList.Add('abc-ghi');
  MList.Add('jkl-mno');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  MList.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  StartExecute;
end;

end.
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Unit2
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
unit Unit2;

interface

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

type
  TMyThread = class(TThread)
  private
  protected
    procedure Execute;  override;
  public
  end;

  TForm2 = class(TForm)
  private
    MyThread:  TMyThread;
  public
  end;

var
  Form2: TForm2;
  MList:  TStringList;

procedure StartExecute;

implementation

{$R *.dfm}

procedure StartExecute;
begin
  //  データ転送(アップロード・ダウンロード)開始
  Form2.MyThread := TMyThread.Create(True);
  Form2.MyThread.Resume;

  //  フォームを表示する
  Form2.ShowModal;
end;

procedure TMyThread.Execute;
begin
  ShowMessage(' ===== ' + IntToStr(MList.Count) + ' ===== ' + #13#10 + MList.Text);
  Form2.ModalResult := mrOk;
end;

end.


deldel  2005-07-08 22:21:30  No: 16263

ここの最後にあるように、Createの引数に渡したいデータを書けば
いいと思います。
http://www.borland.co.jp/tips/delphi/dh004/thread_2.html


ギャッツビー  2005-07-08 23:32:06  No: 16264

Form2 に RichEdit を貼り付けて

ShowMessage(' ===== ' + IntToStr(MList.Count) + ' ===== ' + #13#10 + MList.Text);

この部分を以下のようにすると表示されますので
データは正常にわたっているようです。
ShowMessage が悪影響を出していると思うのですが
根拠がないのでご存知の方ご意見を聞かせてください。

Form2.RichEdit1.Lines.Add(' ===== ' + IntToStr(MList.Count) + ' ===== ');
Form2.RichEdit1.Lines.Add(MList.Text);


anone  2005-07-08 23:32:13  No: 16265

スレッドで VCL を操作するには、メソッド全体を Synchronize() で呼び出します。

type
TMyThread = class(TThread)
private
protected
  procedure Execute; override;
public
  procedure Method;
end;

  TForm2 = class(TForm)
  private
    MyThread: TMyThread;
  public
    { Public 宣言 }
  end;

var
  Form2: TForm2;
  MList: TStringList;

procedure StartExecute;

implementation

{$R *.dfm}

procedure StartExecute;
begin
  //  データ転送(アップロード・ダウンロード)開始
  Form2.MyThread := TMyThread.Create(True);
  Form2.MyThread.Resume;

  //  フォームを表示する
  Form2.ShowModal;
end;

procedure TMyThread.Method;
begin
  ShowMessage(' ===== ' + IntToStr(MList.Count) + ' ===== ' + #13#10 + MList.Text);
  Form2.ModalResult := mrOk;
end;

procedure TMyThread.Execute;
begin
  Synchronize(Method);
end;


ギャッツビー  2005-07-08 23:51:56  No: 16266

deldelさん、anoneさん
ありがとうございました。

RichEdit に変更して、データの表示が正常にできましたが、
結局これも、Synchronize を使用していないので
たまたま動作していたというわけなんですね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加