说明:

SendMessage

函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。
  函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
  参数:
  hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
  Msg:指定被发送的消息。
  wParam:指定附加的消息指定信息。
  IParam:指定附加的消息指定信息。
  返回值:返回值指定消息处理的结果,依赖于所发送的消息。

//*************************   窗体文件  *******************************

unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,MyThread, StdCtrls;
const
  WM_MYQUIT=WM_USER+101;
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    FThread:TMyThread;
  public
    { Public declarations }

procedure MyQuit(var Msg:TMessage);message WM_MYQUIT;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Assigned(FThread) then
    showmessage('存在')
  else
    showmessage('不存在');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FThread:=TMyThread.Create(False);
end;

procedure TForm1.MyQuit(var Msg: TMessage);
var
  BeginTime:DWORD;
begin
  BeginTime:=GetTickCount;
  if Assigned(FThread) then
  begin
    FThread.Terminate;
    if FThread.Suspended then
      FThread.Resume;

//  如果线程使用SendMessage发送消息后
    //  则 FThread.WaitFor;  线程将一直等待下去,
    //  原因是:SendMessage一直在等待窗口程序处理完消息再返回 ,程序将出现一直等待,直到主线程退出
    FThread.WaitFor;  //  程序一直等待 直到线程退出
    FThread.Free;
    FThread:=nil;
  end;
  Label1.Caption:='运行时间: '+intTostr(GetTickCount-BeginTime);
end;

end.

//  *****************************   下面是简单的线程类,主要用于给主窗体发送消息,通知结束线程  ************

unit MyThread;

interface

uses
  Classes,windows,Messages;

type
  TMyThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

implementation

uses Main;

{ 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 MyThread.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ TMyThread }

procedure TMyThread.Execute;
begin
  // 发送消息给主窗口,通知结束该线程
  // SendMessage(Form1.Handle,WM_MYQUIT,0,0);

PostMessage(Form1.Handle,WM_MYQUIT,0,0);

end;

end.

转载于:https://www.cnblogs.com/xiaowangstream/archive/2009/11/03/1595347.html

线程安全退出 VS PostMessage,SendMessage的区别相关推荐

  1. WindowsAPI中PostMessage与SendMessage的区别

    1.返回值意义的区别,先看一下 MSDN 里的声明: LRESULT SendMessage(         HWND hWnd,         UINT Msg,         WPARAM ...

  2. PostMessage,SendMessage,GetMessage,PeekMessage,TranslateMessage,DispatchMessage的用法集合

    SendMessage函数功能描述:将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口过程,直到窗口过程处理完消息后才返回. Postmessage函数则是将消息放入消息队列里,并立即返回. ...

  3. MFC 线程的退出方法

    A.线程函数的返回(推荐用法)(需要考虑的是catch/运行标志/错误处理等方法) B.ExitThread函数(不推荐) C.同一个进程或者另一个进程中的线程调用TerminateThread函数( ...

  4. 线程的退出 java_(转)Java结束线程的三种方法

    背景:面试过程中问到结束线程的方法和线程池shutdown shutdownnow区别以及底层的实现,当时答的并不好. 线程属于一次性消耗品,在执行完run()方法之后线程便会正常结束了,线程结束后便 ...

  5. QT c++ 中使用PostMessage/SendMessage实例

    PostMessage是Windows API(应用程序接口) 中的一个常用函数,用于将一条消息放入到消息队列中.并且不会等待响应的线程处理消息,而是直接返回.(简单的理解就是异步). 而SendMe ...

  6. windows系统中创建线程常用哪几个函数,有什么区别?

    windows系统中创建线程常用哪几个函数? 在windows系统中创建线程的函数有: CreadThread,AfxBeginThread,_beginthread,_beginthreadex. ...

  7. 在别的函数或者线程函数里使用 PostMessage

    在别的函数或者线程函数里使用 PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)小收获 分类: VC++ 2011-12-15 20 ...

  8. 通过PostMessage/SendMessage实现模拟键盘鼠标按键,发送不成功或出现重复按键的可参考本文

    函数原型如下: BOOL WINAPI PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); LRESULT SendMessage ...

  9. 线程与进程之间的关系和区别

    线程共享的环境包括:进程代码段,进程的公有数据(利用这些数据,线程很容易实现相互间的通讯),进程打开的文件描述符,信号的处理器进程的当前目录和进程用户ID与进程组ID. 进程拥有这许多共性的同时,还拥 ...

最新文章

  1. C++:将char*指针强制转换成一个指向结构体的指针
  2. [译]Professional ASP.NET MVC3(01)-Chapter 1:Getting Started(上)
  3. 蓝桥杯:入门训练 圆的面积
  4. 《算法竞赛进阶指南》打卡-基本算法-AcWing 96. 奇怪的汉诺塔:递推
  5. manifold learning 流形学习 zz
  6. raptor算法流程图例题_RAPTOR流程图+算法程序设计教程
  7. Java命令行界面(第13部分):JArgs
  8. gwt-2.8.2下载_GWT 2 Spring 3 JPA 2 Hibernate 3.5教程
  9. c语言中元音字母对应的的值,全国计算机等级考试二级C语言南开上机百题改错题第59...
  10. ## CSP 201612-1 中间数(C语言)(100分)
  11. iOS 动画十四:Replicating Animations
  12. java连接达梦数据库_java连接达梦数据库的简单代码
  13. 0.0 研磨设计模式
  14. 帝国cms 首页php,帝国CMS新增加专题页面
  15. 软件测试 因果+决策案例--中国象棋中走马
  16. 计算机网络期末考试代做,代做计算机作业-易指做帮写网
  17. 听说你也想修改IP归属地?
  18. 开关电源设计实例之Boost 篇
  19. LaTeX入门学习(2)(安装)
  20. 词典php,php词典

热门文章

  1. 上传一批动画教程(链接已失效)
  2. java io复用_学习Java编程-IO复用
  3. 列表ListView和列表选择框的使用编写步骤
  4. 国立大学 计算机,新加坡国立大学 计算机
  5. 用例图(use case)
  6. RabbitMQ死信队列代码架构图
  7. 缓冲池Buffer Pool
  8. 字符流读数据的2种方式
  9. 数据库设计对性能的影响
  10. 迭代器模式源码解析(jdk+mybatis)