出错的地方我知道应该用synchronize来解决,可我加了不行,那位帮忙!!
代码如下:
unit reimage;
interface
uses
Classes, Windows, Messages, SysUtils, Variants, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShDocVW, ExtCtrls, jpeg;
type
TTreimageForm = class(TForm)
Image1: TImage;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
private
public
end;
var
reimageForm: TreimageForm;
phint:string;
implementation
{$R *.dfm} procedure ThreadFunc(P:pointer);stdcall;
begin
phint:='新图片';
reimageForm.Image1.Hint:=phint;//这行出错,也就是线程内不能对VCL操作,如何解决??
end;
procedure TreimageForm.FormCreate(Sender: TObject);
begin
Height:=60;
end;
procedure TreimageForm.FormShow(Sender: TObject);
var hThread:Thandle;
ThreadID:DWord;
begin
hthread:=CreateThread(nil,0,@ThreadFunc,nil,0,ThreadID);
if hThread=0 then
messagebox(Handle,'线程出错!',nil,MB_OK);
end;
end.
代码如下:
unit reimage;
interface
uses
Classes, Windows, Messages, SysUtils, Variants, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShDocVW, ExtCtrls, jpeg;
type
TTreimageForm = class(TForm)
Image1: TImage;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
private
public
end;
var
reimageForm: TreimageForm;
phint:string;
implementation
{$R *.dfm} procedure ThreadFunc(P:pointer);stdcall;
begin
phint:='新图片';
reimageForm.Image1.Hint:=phint;//这行出错,也就是线程内不能对VCL操作,如何解决??
end;
procedure TreimageForm.FormCreate(Sender: TObject);
begin
Height:=60;
end;
procedure TreimageForm.FormShow(Sender: TObject);
var hThread:Thandle;
ThreadID:DWord;
begin
hthread:=CreateThread(nil,0,@ThreadFunc,nil,0,ThreadID);
if hThread=0 then
messagebox(Handle,'线程出错!',nil,MB_OK);
end;
end.
procedure TreimageForm.FormShow(Sender: TObject);
var hThread:Thandle;
ThreadID:DWord;
begin
reimageForm := Self; <<<----------------------------------------//
hthread:=CreateThread(nil,0,@ThreadFunc,nil,0,ThreadID);
if hThread=0 then
messagebox(Handle,'线程出错!',nil,MB_OK);
end;
phint:='新图片';
reimageForm.Image1.Hint:=phint;
独立出一个函数procedure mySetHint()
begin...end;procedure ThreadFunc(P:pointer);stdcall;
begin
synchronize(mySetHint);
end;
第一种方法已实现,我下午回来给你放分,十分感谢!
另第二种方法:这样是可以的, 只是没有考虑线程安全,如果要考虑,就要把
独立出一个函数procedure mySetHint()
begin
phint:='新图片';
reimageForm.Image1.Hint:=phint;
end;procedure ThreadFunc(P:pointer);stdcall;
begin
synchronize(mySetHint);
end;这个我也是这样写过,可在运行时synchronize(mySetHint);这里报错,不知道什么原因,可以帮我解释一下吗,是否还应该有什么说法?