首页 | 源码下载 | 编程控件 | 书籍教程 | 应用方案 | 设计素材 | 项目交易 | 开发文档 | 商业源码 | 我的帐号
登陆我的帐号
帐 号:
密 码:
我还不是会员,需要注册!

截止2004年12月16日
本站源码总量(商业源码除外)RAR压缩为 4,206,733 KB。其中免费源码为 1,124,495 KB,会员源码为 3,082,238 KB
C/C++ 129,555 KB
Delphi 1,258,381 KB
Java 120,937 KB
.Net 36,886 KB
PowerBuilder 954,525 KB
Visual Basic 923,454 KB
ASP 259,795 KB
JSP 4,987 KB
其他 94,723 KB

本站是中国频道、中资源、时代互联顶级代理:注册国际域名70元,国内域名130元,各类ASP、PHP、JSP空间8折优惠!
本站承担各类网站制作开发及方案策划,项目经验丰富,欢迎洽谈!

网站动态
关于下载速度慢的问题解答
想免费下载源码吗?
还有众多资源恭候大家免费…
道歉!
关于资源更新的说明
关于下载错误的原因!
源码资源网新版网站投入运…

当前位置:源码资源网首页 > 开发文档首页 > Delphi >Delphi7 从子线程中发送消息到主线程触发事件执行

Delphi7 从子线程中发送消息到主线程触发事件执行
人气:10 文字大小:     作者:

在对数据库的操作时,有时要用一个子线程来进行后台的数据操作。比如说数据备份,转档什么的。在主窗口还能同是进行其它操作。而有时后台每处理一个数据文件,要向主窗口发送消息,让主窗口实时显示处理进度在窗口上 可视),同时进行日志处理等。我用的是下面的方法:


[1]用到的API函数:
RegisterWindowsMessage
----------------------
函数功能:该函数定义一个新的窗口消息,该消息确保在系统中是唯一的。返回的消息值可在调用函数SendMessage或PostMessage时使用。
function RegisterWindowMessage lpString: PChar): UINT; stdcall;


SendNotifyMessage
----------------------
函数功能:该函数将指定的消息发送到一个窗口。
如果该窗口是由调用线程创建的;此函数为该窗口调用窗口程序,
并等待窗口程序处理完消息后再返回。
如果该窗口是由不同的线程创建的,此函数将消息传给该窗口程序,
并立即返回,不等待窗口程序处理完消息。
SendNotifyMessage HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);


BroadcastSystemMessage
----------------------
函数功能:该函数发送消息给指定的接受者。
接受者可以是一个应用程序、安装驱动器、网络驱动器、系统级设备驱动器
或这些系统组件的组合。


[2]过程:



type
TForm1 = class TForm)
...............
...............
private
Msg: Cardinal;
protected
procedure WndProc var Message: TMessage); override;
public
...............
...............
end;


var
Form1: TForm1;
MsgStrList: TStringList;
MsgStrLock : TCriticalSection;


implementation
uses ThreadCommunication_Unit;
{$R *.dfm}


procedure TForm1.FormCreate Sender: TObject);
begin
Msg := RegisterWindowMessage ’wm_threadmsg’);
MsgStrList := TStringList.Create;
end;


procedure TForm1.WndProc var Message: TMessage);
begin
if Message.Msg = Msg then begin
MsgStrLock.Enter;
if MsgStrList.Count > 0 then begin
Caption := MsgStrList.Strings[0];
MsgStrList.Delete 0);
end;
MsgStrLock.Leave;
ShowMessage ’收到消息了’+ inttostr Message.Msg));
end
else begin
inherited;
end;
end;


procedure TForm1.Button1Click Sender: TObject);
begin
TThreadCommunication.Create Msg,Memo1);
end;
...............
...............


initialization
MsgStrLock := TCriticalSection.Create;
finalization
MsgStrLock.Free;
end.



一个子线程类的单元:



unit ThreadCommunication_Unit;
interface


uses
Classes,StdCtrls;


type
TThreadCommunicaiton = class TThread)
private
FMsg : Cardinal;
FMemo: TMemo;
protected
procedure Execute; override;
procedure SendMsg;
public
constructor Create aMsg:Cardinal;am:TMemo);virtual;
end;


implementation
uses Messages,Windows, Dialogs,SysUtils, ThreadMsg;


{ TThreadCommunicaiton }


constructor TThreadCommunicaiton.Create aMsg: Cardinal; am:TMemo);
begin
inherited Create True);
FMsg := aMsg;
FMemo:= am;
FreeOnTerminate :=True;
Resume;
end;


procedure TThreadCommunicaiton.Execute;
begin
Synchronize SendMsg);
end;


procedure TThreadCommunicaiton.SendMsg;
var
M: TMessage;
B: DWord;
d: integer;
begin
{ Place thread code here }
sleep 50);
M.Msg := FMsg;
B := BSM_ALLCOMPONENTS;


MsgStrLock.Enter;
MsgStrList.Add ’子线程子柄:’+inttostr ThreadID)+ ’ 用BroadcastSystemMessage发送’);
d := MsgStrList.Count;
MsgStrLock.Leave;


BroadcastSystemMessage BSF_POSTMESSAGE, @B , M.Msg, M.WParam, M.LParam );
FMemo.Lines.Add ’子线程子柄:’+inttostr ThreadID)+ ’ 用BroadcastSystemMessage发送’+inttostr d));


end;


end.



我在窗口上放有一Memo控件,可以显示一些信息。
同时我定义了一个全局的TStringList的变量,用于存在要从子线程传出的一些值。用BroadcaseSystemMessage发送消息,而消息号由创建子线程时传入。而消息号在FormCreate中用RegisterWindowsMessage定义,并获得一个消息号。
而消息触发后的事件处理写在WndProc中。
这里将子线程传出的字符串写入窗口的标题。


而TStringList的变量作为临界区使用, 因为当两个线程访问全局量时,为防止它们同时执行,需要使用线程同步。


用TCriticalSection进行操作。
Enter,进入临界区
Leave,离开临界区
这样可以正确的处理从子线程发来的消息。


如果是用SendNotifyMessage函数发送消息的话。
用法如下:



M.Msg := FMsg;
SendNotifyMessage HWND_BROADCAST,M.Msg , M.WParam, M.LParam);



参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。


由于是用SendNotifyMessage将消息发送到主窗口,而主窗口所在线程与调用线程是同一个线程,所以要等待窗口程序处理完消息后再返回。才会执行子线程中的:


FMemo.Lines.Add ’子线程子柄:’+inttostr ThreadID)+ ’ 用SendNotifyMessage发送’);



 

文章出处:   发表时间:2004-11-17 22:50:31

1条数据记录,分1页显示 上一页 < [1] > 下一页
相关文章  
[源码下载] · comicq源代码
[书籍教程] · VC++ 6.0数据库系统开发实例导航
[书籍教程] · Delphi 7数据库编程学习捷径
[书籍教程] · Delphi百例精解
[书籍教程] · DELPHI综合开发文档

相关评论  
 当前没有评论!
请登陆后再来发表评论!
当前位置:源码资源网首页 > 开发文档首页 > Delphi7 从子线程中发送消息到主线程触发事件执行
会员升级 | 广告服务 | 网站开发 | 联系我们 | 网站动态 | 客户反馈

CodeRes.com 保留所有权利 2004
本站所有资源仅供学习参考,版权归原作者所有,如侵犯了您的权益请与我们联系