问个关于多线程的问题。

tw_cshn 2003-08-06 04:00:13
建立一个类
type
TFromThread = class(TThread)
protected
FP:Tfrm_printerwait;
procedure Execute; override;
procedure Stop;
end;
procedure TFromThread.Execute;
begin
FP:=Tfrm_printerwait.Create(Application);
FP.ShowModal;
end;

procedure TFromThread.Stop;
begin
FP.Close;
Fp:=nil;
end;

F:TFromThread;
其它调用
F:=TFromThread.Create(true);
F.Resume;
//其他工作
F.Stop;
F.Terminate;
F:=nil;
但是我调用后执行了F。STOP没有把FORM关闭,依旧显示,不知道什么原因。
我在这里就是想前台显示一个莫态的对话筐,后台作些其他工作。

...全文
28 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
tw_cshn 2003-08-06
  • 打赏
  • 举报
回复
大家吃完饭了吧,继续
tw_cshn 2003-08-06
  • 打赏
  • 举报
回复
刚才用你的测试可以,在我的程序里这样写
F:=TFromThread.Create(True);
F.Priority:=tpLower ;
F.Resume;
F.Stop;
Sleep(200);
F:=nil;
执行F.STOP,出现错误
tw_cshn 2003-08-06
  • 打赏
  • 举报
回复
谢谢,老大啊,这样可以了,我想主要的原因是没有执行Synchronize(CreateForm);
爱编程的老五 2003-08-06
  • 打赏
  • 举报
回复
线程单元
unit Unit2;

interface

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

const
WM_MyMessage = WM_USER + $1000;

type
TForm2 = class(TForm)
private
{ Private declarations }
procedure ProcessMyMessage(var msg: TMessage);message WM_MyMessage;
public
{ Public declarations }
end;

type
TTestThread = class(TThread)
private
FMyForm: TForm2;
procedure CreateForm;
protected
procedure Execute;override;
public
procedure Stop;
end;


implementation

{$R *.dfm}

{ TTestThread }

procedure TTestThread.CreateForm;
begin
FMyForm := TForm2.Create(nil);
FMyForm.Show;
end;

procedure TTestThread.execute;
begin
Synchronize(CreateForm);
end;

procedure TTestThread.Stop;
begin
postmessage(FMyForm.Handle, WM_MyMessage, 0, 0);
end;

{ TForm2 }

procedure TForm2.ProcessMyMessage(var msg: TMessage);
begin
close;
end;

end.
爱编程的老五 2003-08-06
  • 打赏
  • 举报
回复
这是我刚写的测试例子,调试通过;
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
TestThread: TTestThread;

implementation


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
TestThread := TTestThread.Create(false);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
TestThread.stop;
end;

end.
tw_cshn 2003-08-06
  • 打赏
  • 举报
回复
而且我确认发送消息了,也接收到了消息,执行了CLOSE
但是窗口还是不关闭,真的是搞不懂了
爱编程的老五 2003-08-06
  • 打赏
  • 举报
回复
也不是说一定要用线程,但从我的经验中总结出来的,在线程这类操作中,与界面组件交互时,用消息是最安全,也是处理简单的.
tw_cshn 2003-08-06
  • 打赏
  • 举报
回复
我又修改为发送消息来关闭也不行。
procedure TFromThread.DoTerminate(Sender: TObject);
var
i:integer;
begin
{FP.Close;
Fp:=nil;}
PostMessage(fp.handle,WM_STOPCLOSE,0,0);
end;

procedure Tfrm_printerwait.WMSTOPCLOSE(var Message: TMessage);
begin
Close;
end;
tw_cshn 2003-08-06
  • 打赏
  • 举报
回复
我直接用
EndDialog(H,i);
H是建立的时候所得到的句柄,但是窗口还是存在
tw_cshn 2003-08-06
  • 打赏
  • 举报
回复
为什么一定要用消息,直接用语句不行吗?请指教
爱编程的老五 2003-08-06
  • 打赏
  • 举报
回复
差点忘了,在线程中操作VCL对象时,需用Synchronize来同步操作.
爱编程的老五 2003-08-06
  • 打赏
  • 举报
回复
1.定义一个消息常量,并在你的Form中实现,例:
procedure tyourform.processyourmessage(var msg: tmessage);message wm_yourmessage;
begin
close;
end;

2.在线程的stop方法中写:
procedure TyourThread.stop;
begin
postmessage(yourform.handle, wm_yourmessage, 0, 0);
end;

ok了.
tw_cshn 2003-08-06
  • 打赏
  • 举报
回复
还是一样的啊,在帮忙看看
tw_cshn 2003-08-06
  • 打赏
  • 举报
回复
TO:ahjoe(强哥)
改成OnTerminate问题依旧
ahjoe 2003-08-06
  • 打赏
  • 举报
回复
type
TFormThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure DoTerminate(Sender: TObject);
end;

implementation

procedure TFormThread.Execute;
begin
{ Place thread code here }
OnTerminate := DoTerminate;
FP:=Tfrm_printerwait.Create(Application);
FP.ShowModal();
repeat
Sleep(10);
until False;
end;

procedure TFormThread.DoTerminate(Sender: TObject);
begin
FP.Close;
Fp:=nil;
end;

...
F:=TFromThread.Create(true);
F.Resume;
//ÆäËû¹¤×÷
F.Terminate;
F:=nil;

...
tw_cshn 2003-08-06
  • 打赏
  • 举报
回复
TO:ahjoe(强哥)
(其实你不必多用一个线程。)
请指点如何做
ahjoe 2003-08-06
  • 打赏
  • 举报
回复
procedure TFromThread.Stop;
begin
FP.Close;
Fp:=nil;
end;
改为
procedure TFromThread.OnTerminate;
begin
FP.Close;
Fp:=nil;
end;

其实你不必多用一个线程。
tw_cshn 2003-08-06
  • 打赏
  • 举报
回复
大鸟,小鸟都来指点啊!!!!
tw_cshn 2003-08-06
  • 打赏
  • 举报
回复
自己UP
dawnming 2003-08-06
  • 打赏
  • 举报
回复
up

5,385

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧