<font color=red>睡着了醒不来,怎么办呀?</font>(100分)

  • 主题发起人 主题发起人 吴剑明
  • 开始时间 开始时间

吴剑明

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个线程,要求程序启动时是挂起睡大觉的。
当接收到某个消息后,就醒来干活,干完后再睡。
我声明一个消息: WM_WJM,
在程序启动时先SUSPEND,拦截到消息后RESUME。
之后就不知怎么办了。
const
wm_wjm = wm_user + 100;
procedure mymsg(var msg : TMEssage);message wm_wjm;
var
Form1: TForm1;
a : Tmh;
procedure TForm1.mymsg(var msg : TMEssage);
begin
a.Resume;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
a := TMH.Create(true);
a.Suspend ;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
sendmessage(form1.handle,wm_wjm,0,0);
end;

线程在这里干活
procedure Tmh.Execute;
begin
{ Place thread code here }
showmessage('hello');
suspend;
end;

end.

按下发消息的按钮一后,没反映。再按一次,就显示(HELLO)了,然后再按N次,就再
也没反应了。
醒不来了。
 
try postmessage
 
不是睡着了,而是线程结束了!根本没有下一次的激活。
在Execute中,是不能让它结束的。它的结束,就意味着线程完成了使命。
下面给出的例子与你所想是一致的:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
const
WM_CallMyTh = WM_User+101;
type
Th = Class(TThread)
protected
procedure Execute;override;
end;

TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
protected
procedure WM_CallTH(var Mes : TMessage);Message WM_CallMyTh;
public
{ Public declarations }
end;

var
Form1: TForm1;
myTh : TH;
implementation
{$R *.DFM}
procedure Th.Execute;
begin
while truedo
begin
//this blockdo
yourself action
MessageDlg('hello',mtInformation,[mbAbort],0);
//code here.
//end of task,then
Suspend;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
myTH := TH.Create(true);
end;

procedure TForm1.WM_CallTH(var Mes : TMessage);
begin
myTH.resume;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(Handle,WM_CallMyth,0,0);
end;

end.

你要小心线的重入,导致执行的结果超出预料。
 
同意guojun的看法
&amp;micro;&amp;Uacute;&amp;Ograve;&amp;raquo;次°&amp;acute;&amp;Atilde;&amp;raquo;有showmessage&amp;Ecirc;&amp;Ccedil;:
a := TMH.Create(true);&amp;ordm;ó
a.Suspend ;&amp;AElig;&amp;auml;&amp;Ecirc;&amp;micro;&amp;Atilde;&amp;raquo;&amp;Oacute;&amp;ETH;±&amp;Oslash;&amp;Ograve;&amp;ordf;&amp;pound;&amp;not;
&amp;Ograve;ò&amp;Icirc;&amp;ordf;&amp;Auml;&amp;atilde;&amp;Ecirc;&amp;Ccedil;create(true),&amp;Egrave;&amp;yen;&amp;micro;&amp;ocirc;
a.suspend&amp;micro;&amp;Uacute;&amp;Ograve;&amp;raquo;&amp;acute;&amp;Icirc;°&amp;acute;&amp;frac34;&amp;Iacute;showmessage
th.execute°&amp;acute;guojun&amp;micro;&amp;Auml;&amp;frac14;&amp;acute;&amp;iquest;&amp;Eacute;
 
可以结束了吧
 
不能结束。:)
第一次按下去发消息,不知为何无反应。
第二次按下去,才开始正常。
为何?
 
这样就可以了
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
const wm_wjm = wm_user + 100;
type
Tmh = Class(TThread)
protected
procedure Execute;override;
end ;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure mymsg(var msg : TMEssage);message wm_wjm;
end;

var
Form1: TForm1;
a : Tmh;
implementation
{$R *.DFM}
{ TForm1 }
procedure TForm1.mymsg(var msg: TMEssage);
begin
a.Resume ;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
a := TMH.Create(true);
a.Resume ;
a.Suspend ;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
sendmessage(form1.handle,wm_wjm,0,0);
end;

procedure Tmh.Execute;
begin
{ Place thread code here }
showmessage('hello');
suspend;
end;
end.
 
多人接受答案了。
 
抱歉,每想到乱码,让你等了那摸长时间。
乱码部分内容:
同意guojun的看法
第一次没有showmessage是因为:
a := TMH.Create(true);后又
a.Suspend ;//去掉此行即可
因为你用create(true),然后又
a.suspend,所以不能showmessage
th.execute同意guojun永真循环
 

Similar threads

I
回复
0
查看
778
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
732
import
I
D
回复
0
查看
937
DelphiTeacher的专栏
D
后退
顶部