线程安全退出 VS PostMessage,SendMessage的区别
说明:
SendMessage
函数原型: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的区别相关推荐
- WindowsAPI中PostMessage与SendMessage的区别
1.返回值意义的区别,先看一下 MSDN 里的声明: LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM ...
- PostMessage,SendMessage,GetMessage,PeekMessage,TranslateMessage,DispatchMessage的用法集合
SendMessage函数功能描述:将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口过程,直到窗口过程处理完消息后才返回. Postmessage函数则是将消息放入消息队列里,并立即返回. ...
- MFC 线程的退出方法
A.线程函数的返回(推荐用法)(需要考虑的是catch/运行标志/错误处理等方法) B.ExitThread函数(不推荐) C.同一个进程或者另一个进程中的线程调用TerminateThread函数( ...
- 线程的退出 java_(转)Java结束线程的三种方法
背景:面试过程中问到结束线程的方法和线程池shutdown shutdownnow区别以及底层的实现,当时答的并不好. 线程属于一次性消耗品,在执行完run()方法之后线程便会正常结束了,线程结束后便 ...
- QT c++ 中使用PostMessage/SendMessage实例
PostMessage是Windows API(应用程序接口) 中的一个常用函数,用于将一条消息放入到消息队列中.并且不会等待响应的线程处理消息,而是直接返回.(简单的理解就是异步). 而SendMe ...
- windows系统中创建线程常用哪几个函数,有什么区别?
windows系统中创建线程常用哪几个函数? 在windows系统中创建线程的函数有: CreadThread,AfxBeginThread,_beginthread,_beginthreadex. ...
- 在别的函数或者线程函数里使用 PostMessage
在别的函数或者线程函数里使用 PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)小收获 分类: VC++ 2011-12-15 20 ...
- 通过PostMessage/SendMessage实现模拟键盘鼠标按键,发送不成功或出现重复按键的可参考本文
函数原型如下: BOOL WINAPI PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); LRESULT SendMessage ...
- 线程与进程之间的关系和区别
线程共享的环境包括:进程代码段,进程的公有数据(利用这些数据,线程很容易实现相互间的通讯),进程打开的文件描述符,信号的处理器进程的当前目录和进程用户ID与进程组ID. 进程拥有这许多共性的同时,还拥 ...
最新文章
- C++:将char*指针强制转换成一个指向结构体的指针
- [译]Professional ASP.NET MVC3(01)-Chapter 1:Getting Started(上)
- 蓝桥杯:入门训练 圆的面积
- 《算法竞赛进阶指南》打卡-基本算法-AcWing 96. 奇怪的汉诺塔:递推
- manifold learning 流形学习 zz
- raptor算法流程图例题_RAPTOR流程图+算法程序设计教程
- Java命令行界面(第13部分):JArgs
- gwt-2.8.2下载_GWT 2 Spring 3 JPA 2 Hibernate 3.5教程
- c语言中元音字母对应的的值,全国计算机等级考试二级C语言南开上机百题改错题第59...
- ## CSP 201612-1 中间数(C语言)(100分)
- iOS 动画十四:Replicating Animations
- java连接达梦数据库_java连接达梦数据库的简单代码
- 0.0 研磨设计模式
- 帝国cms 首页php,帝国CMS新增加专题页面
- 软件测试 因果+决策案例--中国象棋中走马
- 计算机网络期末考试代做,代做计算机作业-易指做帮写网
- 听说你也想修改IP归属地?
- 开关电源设计实例之Boost 篇
- LaTeX入门学习(2)(安装)
- 词典php,php词典