SpeedButton4Click 这个事件没有响应,为什么?
const
  wm_mymessage=wm_user+5;type th=class(tobject)
public
  thread:THandle;
  procedure WMUser(var msg:Tmessage);
    message WM_mymessage;
end;var
thread1:thandle;
thid:DWORD;
lpmsg:msg;
x:bool;
h:th;procedure th.WMUser(var msg:tmessage);
begin
showmessage('消息啊消息');
end;procedure threadfunc1;
var i:integer;
begin
for i:=0 to 100000000 do
  begin
    form1.Edit1.text:=inttostr(i);
  end;end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
h:=th.Create ;
if h.thread<>0 then exit;
h.thread:=createthread(nil,0,@ThreadFunc1,nil,CREATE_SUSPENDED,thid);
if h.thread=0 then
  showmessage('创建线程失败');
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
suspendthread(h.thread);
end;procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
resumethread(h.thread);
end;procedure TForm1.SpeedButton4Click(Sender: TObject);
var x:bool;
beginx:=postmessage(h.thread ,WM_close,0,0);
//这个地方postmessage执行不成功
end;procedure TForm1.SpeedButton5Click(Sender: TObject);
begin
TerminateThread(h.thread , 0);
h.thread:=0;
end;

解决方案 »

  1.   

    把SPEEDBUTTON换在BUTTON试试看吧!
      

  2.   

    每个线程消息都有自己的线程的队列。用POSTMESSAGE只能发在自己的线程里。
    可以用PostThreadMessage..发送方用PostThreadMessage..就行了。
    接收方得主动从队列中取出消息。。
    取出消息后,
    如果在某个对象定义了消息映射函数,就对这个对象分发一下(DISPATCH)这个自定义消息
      

  3.   

    DELPHI的线程是没有消息循环的,要想发送消息
    1,需要在线程里自己生成一个消息队列;
    2,使用POSTTHREADMESSAGE来发送就可以了;
      

  4.   

    unit Unit2;interfaceuses
      Classes,Windows,Messages;
      const wm_test=wm_user+10;
    type
      d = class(TThread)
      private
        { Private declarations }
      protected
        procedure Execute; override;
      end;implementation{ Important: Methods and properties of objects in visual components can only be
      used in a method called using Synchronize, for example,      Synchronize(UpdateCaption);  and UpdateCaption could look like,    procedure d.UpdateCaption;
        begin
          Form1.Caption := 'Updated in a thread';
        end; }{ d }procedure d.Execute;
    var
      dd:Tmsg;
    begin
      { Place thread code here }
     PostMessage(0, WM_USER, 0, 0);
     PeekMessage(dd,0,WM_USER,WM_USER,0);
     while getMessage(dd,0,0,0) do
     begin   if dd.message=wm_test then
       begin
         MessageBox(0,'a','b',0);
       end;
      messageBox(0,'','',0);
      TranslateMessage(dd);
      DispatchMessage(dd); // 该API将消息分派到相应的窗体消息处理函数 end;end;end.
      

  5.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,unit2, StdCtrls, Buttons;type
      TForm1 = class(TForm)
        Button1: TButton;
        BitBtn1: TBitBtn;
        procedure Button1Click(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
       dd:d;
    implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      dd:=d.Create(false);end;procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
        postthreadmessage(dd.ThreadID,wm_test,0,0);
    end;end.