Delphi 线程间发送消息

线程B向线程A发送消息,SendMessage(线程A句柄, msg, wParam参数, lParam参数);

线程A重写WndProc(var Message: TMessage);

 1 { 线程B发送消息 }
 2 unit ThreadUnit;
 3
 4 interface
 5
 6 uses
 7   Classes, ActiveX, businessService, Dialogs, Constant, Windows, Messages, SysUtils;
 8
 9 type
10   TUpgradeAppThread = class(TThread)
11   protected
12     procedure execute; override;
13   private
14     appFileDir: string;
15     manualCheck: Boolean;
16   public
17     MainFromHandle: HWND;  //主线程句柄
18     constructor Create(appFileDir: string; manualCheck: Boolean);
19   end;
20
21 const {0x0400 - 0x7FFF}
22   WM_UPDATE_UI1 = WM_USER + $1001;
23   WM_UPDATE_UI2 = WM_USER + $1002;
24
25 var
26   upgradeAppThread: TUpgradeAppThread;
27
28 implementation
29
30 constructor TUpgradeAppThread.Create(appFileDir: string; manualCheck: Boolean);
31 begin
32   inherited Create(False);
33   Self.appFileDir := appFileDir;
34   Self.manualCheck := manualCheck;
35 end;
36
37 procedure TUpgradeAppThread.Execute;
38 var
39   res: string;
40   sData: TCopyDataStruct;
41 begin
42   FreeOnTerminate := True;
43   try
44     res := upgradeApplication(appFileDir, False);
45     if res = ‘0‘ then
46     begin
47       //未检测到完整版客户更新才进行dll更新检测
48       res := upgradeDllOnline(appFileDir);
49     end;
50
51     if res = ‘0‘ then
52     begin
53       if Self.manualCheck then
54       begin
55         ShowMessage(‘博思客户端是最新版本,无需更新!‘);
56       end;
57     end
58     else if res = BSERROR_NO_SERVCONF then
59     begin
60       if Self.manualCheck then
61       begin
62         ShowMessage(‘更新服务器地址为空!‘);
63       end;
64     end
65     else if res = ‘2‘ then
66       SendMessage(MainFromHandle, WM_UPDATE_UI2, 0, 0)  //向主线程发送dll更新消息
67     else
68     begin
69       try
70         sData.lpData := PChar(res);
71         SendMessage(MainFromHandle, WM_UPDATE_UI1, 0, Cardinal(@sData));   //向主线程发客户端更新消息
72       finally
73 //        FreeMem(sData.lpData);
74       end;
75     end;
76   finally
77
78   end;
79 end;
80
81 end.
 1 { 线程A接收消息 }
 2 protected
 3     procedure WndProc(var Message: TMessage); override;
 4
 5 //创建线程B
 6 upgradeAppThread := TUpgradeAppThread.Create(appFileDir, manualCheck);   //将检查更新放在线程中执行
 7   upgradeAppThread.MainFromHandle := Self.Handle;
 8
 9
10 procedure TfrmMain.WndProc(var Message: TMessage);  //接收线程消息
11 var
12   param: TStringList;
13   httpClient: TIdHTTP;
14   controlUrl, res: string;
15   appPath: string;
16   cdds: TcopyDataStruct;
17 begin
18   res := ‘‘;
19   case Message.Msg of
20     WM_UPDATE_UI1:   { 客户端更新消息 }
21       begin
22         res := ‘博思客户端助手需要更新到最新版本,需要关闭客户端才能更新,是否立即更新?‘;
23         cdds := PcopyDataStruct(Message.LParam)^;
24         appPath := StrPas(PChar(cdds.lpData));
25         controlUrl := ‘http://‘ + serverIp + ‘:‘ + IntToStr(StrToInt(serverPort) + 2) + ‘/upgradeMainApp?fp=‘ + appPath;
26       end;
27     WM_UPDATE_UI2:  { dll更新消息 }
28       begin
29         res := ‘检测到客户端组件更新,博思客户端助手需要重启才能更新,是否立即更新?‘;
30         controlUrl := ‘http://‘ + serverIp + ‘:‘ + IntToStr(StrToInt(serverPort) + 2) + ‘/controlMainApp?ct=2‘;
31       end;
32   else
33     inherited;
34   end;
35   if res <> ‘‘ then
36   begin
37     try
38       if MessageBox(Self.Handle, PChar(res), ‘询问‘, MB_ICONQUESTION + MB_YESNO + MB_TOPMOST + MB_DEFBUTTON2) = IDYES then
39       begin
40         param := TStringList.Create;
41         httpClient := TIdHTTP.Create;
42         controlUrl := StringReplace(controlUrl, ‘ ‘, ‘%20‘, [rfReplaceAll]);
43         httpClient.Post(controlUrl, param);
44       end;
45     finally
46       httpClient.Free;
47       param.Free;
48     end;
49   end;
50 end;
时间: 2024-09-30 11:17:17

Delphi 线程间发送消息的相关文章

Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)

keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主要研究Handler的消息发送. 包含主线程往子线程发送消息,子线程之间互相发送消息. 一.主线程向子线程发送消息. 实现过程比較简单: 主线程发送消息到异步线程.异步线程接收到消息后在再发送一条消息给主线程. 1. 初始化主线程的Handler,用来接收子线程的消息. 2. 启动异步线程.在异步线

TMsgThread, TCommThread -- 在delphi线程中实现消息循环(105篇博客,好多研究消息的文章)

在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使用很方便,但是有时候我们需要在线程类中使用消息循环,delphi没有提供. 花了两天的事件研究了一下win32的消息系统,写了一个线程内消息循环的测试. 但是没有具体应用过,贴出来给有这方面需求的DFW参考一下.希望大家和我讨论. {----------------------------------------------------------------------------- Unit

在delphi线程中实现消息循环

http://delphi.cjcsoft.net//viewthread.php?tid=635 在delphi线程中实现消息循环 Delphi的TThread类使用很方便,但是有时候我们需要在线程类中使用消息循环,delphi没有提供. 花了两天的事件研究了一下win32的消息系统,写了一个线程内消息循环的测试. 但是没有具体应用过,贴出来给有这方面需求的DFW参考一下.希望大家和我讨论. {--------------------------------------------------

Delphi7从子线程中发送消息到主线程触发事件执行

[转载]Delphi7从子线程中发送消息到主线程触发事件执行 在对数据库的操作时,有时要用一个子线程来进行后台的数据操作.比如说数据备份,转档什么的.在主窗口还能同是进行其它操作.而有时后台每处理一个数据文件,要向主窗口发送消息,让主窗口实时显示处理进度在窗口上(可视),同时进行日志处理等.我用的是下面的方法: [1]用到的API函数: RegisterWindowsMessage ---------------------- 函数功能:该函数定义一个新的窗口消息,该消息确保在系统中是唯一的.返

linux上 用户间发送消息 通信

联想:scp命令 1.使用write命令,向指定用户发送信息:           用户可以使用write命令给其他在线用户发送消息.格式: $ write zhangsan hello   world      //通信内容 按CTRL+D就将消息发送给zhangsan这个用户.          在Shell提示符号输入write,username指接受发送信息的用户名.如果一个用户多次登录到系统, tty参数指定要发送的终端.使用write发送信息的前提条件是该用户已经登录到系统. 可以使

使用PostThreadMessage在Win32线程间传递消息

PostThreadMessage可以用于线程之间的异步通讯,因为它不用等待调用者返回,这也许是线程通讯中最简单的一种方法了. PostThreadMessage是一个Windows API函数.其功能是将一个消息放入(寄送)到指定线程的消息队列里,不等待线程处理消息就返回. 原型: BOOLPostThreadMessage( DWORDidThread, UINTMsg, WPARAMwParam, LPARAMIParam); 参数: idThread   其消息将被寄送的线程的线程标识符

Android:主线程如何向子线程发送消息

今天讲一下,在Android中主线程如何向子线程中发送消息的问题. 或许回想无非就是创建一个Handler对象,然后一个线程发消息,另一个接收消息嘛-- 原理确实是这样,但是我们平时,是从子线程向主线程发消息,而主线程默认已经帮我们完成了Looper的操作,所以我们只需要简单的"创建一个Handler对象,然后一个线程发消息,另一个接收消息"-- 我们先说一下这个Looper是神马吧. 它就像一个消息队列(MessageQueue)的管家(Looper),一个消息队列只有一个管家,并且

VC++多线程编程-线程间的通信和线程同步

引用:http://blog.csdn.net/zjc0888/article/details/7372258 线程间通讯 一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信.这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的,下面将进行说明. 使用全局变量进行通信 由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故解决线程间通信最简单的一种方法是使用全局变量.对于标准类型

说说Java线程间通信

序言 正文 [一] Java线程间如何通信? 线程间通信的目标是使线程间能够互相发送信号,包括如下几种方式: 1.通过共享对象通信 线程间发送信号的一个简单方式是在共享对象的变量里设置信号值:线程A在一个同步块里设置boolean型成员变量hasDataToProcess为true,线程B也在同步块里读取hasDataToProcess这个成员变量:线程A和B必须获得指向一个MySignal共享实例的引用,以便进行通信:如果它们持有的引用指向不同的MySingal实例,那么彼此将不能检测到对方的