解决方案 »
- 用VCL.net做的程序怎么发布?
- 请问这种情况怎么实现(问题不知道怎么简单描述)
- CSDN上搜一搜,相关发问者都没有得到同类问题解决----同命相怜,没有分祝大家身体健康
- 好久没上坛子了,请教如何自己绘制TListView的Item,回复者给分.我想绘制不同的颜色哦,请进吧!!
- 用下载的问题:用代理上网是不是BT用不成了,怎么办??
- 怎样使任务栏不出现应用程序图标?
- 高难问题...
- 如何得到数据表单中的某个字段内容不重复的记录(不使用distinct)(在VC++下也有同样的帖子同样加分)
- 首次提问
- 我真不懂现在DELPHI 6都出来了,为什么《DELPHI 4 从入门到精通》这本书还会这么热?
- 找个人来看看这段程序!
- delphi中如何将数据从sqlserver高效导入到oracle中
用TThread类吧,有个小例子:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FMyThread: TThread;
procedure DoMyTerminateEvent(Sender: TObject);
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}type
TMyThread = class(TThread)
procedure Execute; override;
procedure DoIt;
end;{ TMyThread }procedure TMyThread.DoIt;
begin
ShowMessage('线程执行中...');
end;procedure TMyThread.Execute;
begin
inherited;
//线程中执行的代码,如果访问界面,就需要同步到主线程:
Synchronize(DoIt);
end;{ TForm1 }procedure TForm1.DoMyTerminateEvent(Sender: TObject);
begin
ShowMessage('线程终止');
end;procedure TForm1.FormCreate(Sender: TObject);
begin
FMyThread := TMyThread.Create(True);
FMyThread.OnTerminate := DoMyTerminateEvent;
FMyThread.Resume;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
FMyThread.Free;
end;end.
为什么我个人觉得用TThread类好像比API难?
那个Synchronize我查了一下词典是同步的意思。你的意思是说,Form2.show这类代码要用这个函数来运行吗?FMyThread.OnTerminate := DoMyTerminateEvent; 这个是用来只是线程终止事件的吧?
我根据你提供的代码,添加了自己的测试代码进行了测试。发现了一个问题。测试代码:procedure TMyThread.Execute;
var
i:integer;
begin
inherited;
//线程中执行的代码,如果访问界面,就需要同步到主线程:
for i:=0 to 500000 do
begin
Form1.Canvas.Lock;
Form1.Canvas.TextOut(100, 100, IntToStr(i));
Form1.Canvas.Unlock;
end;
Synchronize(DoIt);
end;
当线程启动之后、未结束之前,如果我点击关闭程序,界面是关闭了,但实际上程序仍然在内存中继续运行,只有等到线程完成之后程序才能完全退出。想请问一下,我们不是已经使用了procedure TForm1.FormDestroy(Sender: TObject);
begin
FMyThread.Free;
end;吗?这个问题该如何解决?
您好!我将Form2.Show;写入procedure TMyThread.DoIt;中,可是已经是运行了Form2的代码,却不显示窗体