线程无法按预期更新图像

时间:2015-09-28 23:27:31

标签: multithreading delphi

我正在尝试编写一个Delphi代码来更新from上的TImage组件。我使用C ++很长一段时间但是在Delphi上没有太多经验;但是,出于某种原因我需要使用Delphi。我获得并修改了类似的代码来完成任务,如下所示。我在表单上放置了4个TImages组件,当播放器按下按钮时,我启动一个线程来更新图像。我在项目中嵌入了6个资源位图,编号为1到6,代码将随机选择并将资源位图加载到TImage中。我发现有时使用线程,一些图像将不会被绘制(只是空白,就像没有加载图像一样)。我知道你可能想知道为什么我需要使用一个线程,为什么不按下按钮时调用ShowRanodmImage。在这个简单的例子中,我肯定不必使用线程,但我将适用于必须使用线程的某些情况。所以我的问题是为什么下面的代码将不会显示正确的图像?如何解决?非常感谢。

unit TTUnit;

interface

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

type
  TTestThread = class;

  TTestForm = class(TForm)
    NextBTN: TButton;
    P11: TPanel;
    P12: TPanel;
    P13: TPanel;
    P14: TPanel;
    CELL11: TImage;
    CELL12: TImage;
    CELL22: TImage;
    CELL21: TImage;

    procedure FormCreate(Sender: TObject);
    procedure NextBTNClick(Sender: TObject);

  private
    myThread :TTestThread;
    pImgs: array[1..2, 1..2] of TImage;

  public
    procedure ShowRandomImg;
  end;

  TTestThread = class(TThread)
  private
    myForm :TTestForm;
  protected
    procedure Execute(); override;
  public
    constructor Create(aFrom :TTestForm; CreateSuspended: Boolean);
  end;

var
  TestForm: TTestForm;

implementation

{$R *.dfm}

procedure TTestForm.FormCreate(Sender: TObject);
begin
  myThread := TTestThread.Create(Self, True);

  pImgs[1][1]:=CELL11; pImgs[1][2]:=CELL12;
  pImgs[2][1]:=CELL21; pImgs[2][2]:=CELL22;
end;


procedure TTestForm.NextBTNClick(Sender: TObject);
begin
  myThread.Resume;
end;

procedure TTestForm.ShowRandomImg;
var
 i, j :Integer;
 r :array[1..2, 1..2]  of Integer;
begin
  Self.NextBTN.Enabled := false;
  r[1][1] := Random(6)+1;
  r[1][2] := Random(6)+1;
  r[2][1] := Random(6)+1;
  r[2][2] := Random(6)+1;
  for i := 1 to 2 do
  begin
    for j := 1 to 2 do
    begin
      pImgs[i][j].Picture.Bitmap.LoadFromResourceID(HInstance, r[i][j]);
      pImgs[i][j].Canvas.Font.Size := 38;
      pImgs[i][j].Canvas.Font.Color := clRed;
      pImgs[i][j].Canvas.Font.Style := [fsBold];
      pImgs[i][j].Canvas.TextOut(20, 20, inttostr(r[i][j]));
    end;
  end;
  Self.NextBTN.Enabled := true;
end;

////////////////////
constructor TTestThread.Create(aFrom: TTestForm; CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
  Self.myForm := aFrom;
end;

procedure TTestThread.Execute;
begin
  inherited;
  Repeat
    Self.myForm.ShowRandomImg;
    Self.Suspend;
  Until Terminated;

end;
end.

0 个答案:

没有答案