行处理和做 出响应。从某种意义上讲,Windows的应用程序不过是 一个消息处理器。事件就是被消息所驱动的。每个应用 程序内部必定有一段循环程序,负责检索其消息队列, 这段特殊的程序称为消息循环(message loop)。
消息的数据结构在Windows中被定义为如下 的记录类型: TMessage = record Msg: Cardinal; WParam: Word; LParam: Longint; Result: Longint; end;
消息定义为如下的TMsg记录类型: TMsg = packed record hwnd: HWND; message: UINT; wParam: WPARAM; lParam: LPARAM; time: DWORD; pt: TPoint; end;
二、Delphi的消息处理
三、发送消息
下 列 两 个 Windows API 函 数 均 可 实 现 消 息 的 发 送。 ? function SendMessage(hWnd:HWND; Msg:UINT; wParam:WPARAM; lParam:LPARAM) :LRESULT; stdcall; ? function PostMessage(hWnd:HWND; Msg:UINT; wParam:WPARAM; lParam:LPARAM) : BOOL; stdcall;
四、响应消息
1. 覆盖组件继承的虚拟方法WndProc procedure TNewComponent.WndProc(var message:TMessage); begin if message.Msg = 需要过滤的消息 then begin // 此处编写处理过滤消息代码 exit; end; inherited WndProc(message); dispatch(message); end;
2. 覆盖组件继承的虚拟方法 DefaultHandler 在 继 承 类 中 对 DefaultHandler 过 程 进 行 覆 盖,同样可以实现类似于前一种方法的消 息过滤。
3. 自定义消息和消息处理方法 Windows 预 定 义 了 1024 个 编 码 从 $0000 到 $03FF的消息常量标识符,留出从$0400到 $7FFF的编码空间用于用户自定义消息。 其 中 的 $0400 已 定 义 为 WM_USER 。 因 此,自定义消息常量标识
符的形式如下: const WM_UserMsgName = WM_USER + N; // 其中,0<=N<=31743
4. TApplication的OnMessage事件 每当应用程序从消息队列中检索到一个消息 时 , 便 触 发 Application 的 OnMessage 事 件。由此,在消息被派送到对其响应和处 理的目标对象之前,有机会处理该消息。
7.4 多线程编程
? ? ? ? ? ? 一、进程与线程 二、TThread类 三、创建线程类 四、线程的优先级与线程调度 五、线程的挂起、恢复和终止 六、线程的协调
一、进程与线程
在Windows操作系统中,可以同时运行多个 程序,甚至可以启动一个程序的多个实 例,此即所谓的多任务。可见,静态的程 序与在
计算机中运行的程序是有区别的。 为明确概念,特将载入内存准备执行的应 用程序称为进程。
进程由下列部分组成: ? ? 一个私有的、4GB大小的虚拟地址空 间; ? ? 程序相关的代码和数据; ? ? 操作系统分配给进程的系统资源,如文 件、单独的消息队列、同步对象等; ? ? 至少包含一个线程,这个线程称为主 线程,通过它可以创建或控制其他线程。
进程本身并不直接执行代码,进程内的基 本执行单元是线程。一个进程可以包含多 个线程,每个线程都可以独立运行,并保 持各自的堆栈和寄存器的值。一个线程可 以控制另一个线程的执行,一个进程内的 各个线程共享该进程的虚拟空间和
系统资 源。而不同进程之间则互不干扰。
二、TThread类
TThread类封装了Windows API和System 单元中有关线程运用的函数和例程。与 VCL中一般的类不同的是:TThread类是 一个抽象类,其所带方法是虚拟抽象的, 因而不能直接创建TThread的对象实例, 而必须先声明一个由TThread继承来的线 程类,再利用这个派生类创建线程对象实 例和操纵线程具体类的属性和方法。
1. TThread类的属性 Suspended 属 性 、 Terminated 属 性 、 Priority 属 性 、FreeOnTerminate属性 、ReturnValue属 性。 2. TThread类的方法 Create 方 法 、 Execute 方 法 、 Suspend 方 法 、 Resume方法 、Terminate方法 、DoTerminate 方法 、Synchronize方法 、WaitFor方法 3. TThread类的事件 TThread仅定义了一个OnTerminate事件,当线程 对象运行终止时触发该事件。编写该事件代 码,可用于通知应用程序的