看如下代码unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;const
MyMessage =WM_USER+101;type
  TForm1 = class(TForm)
    Button1: TButton;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure AddStrPro(Var Message:TMessage);message MyMessage;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  ThreadID:DWORD;
  ThreadHandle:THandle;
  :Boolean=True;
  t:Integer=1;
implementation{$R *.dfm}function DataRecv(p: Pointer): DWORD; stdcall;
var
i:Integer;
begin
  while True do
  begin
    SendMessage(Form1.Handle,MyMessage,1,1);
    if Mark=False then Break;
  end;
end;
procedure TForm1.AddStrPro(var Message: TMessage);
var
i:Integer;
begin
  Application.ProcessMessages;//关键就在这句
  Sleep(10);
end;procedure TForm1.Button1Click(Sender: TObject);
begin
  ThreadHandle:= CreateThread(nil, 0, @DataRecv, nil, 0, ThreadID);
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  :=False;
  WaitForSingleObject(ThreadHandle,200);
  Action:=caFree;
end;
end.application.ProcessMessage如果没有这句,一切正常。
加上这句,其他都正常,只有最大,最小,和关闭按钮相应不了???
高手,教教我吧,我分析不出来

解决方案 »

  1.   

    SendMessage 换成 PostMessage 试试
      

  2.   

    线程SendMessage需要等主线程响应完消息才返回,而主线程响应该消息时又ProcessMessages,如果此时关闭窗口,在FormClose中又要等待线程结束,而线程在SendMessage中等待,两边互相等,所以死锁了。问题的关键不在ProcessMessages,即使没有ProcessMessages,如果关闭窗口时刚好线程执行SendMessage,同样会死锁。ProcessMessages只是把死锁的机会增加了。
    可以把Send改成Post,或者不要WaitForSingleObject。