Delphi 线程间发送消息

转载自:https://www.cnblogs.com/ADAN1024225605/p/7927695.html

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

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

{ 线程B发送消息 }
unit ThreadUnit;

interface

uses
  Classes, ActiveX, businessService, Dialogs, Constant, Windows, Messages, SysUtils;

type
  TUpgradeAppThread = class(TThread)
  protected
    procedure execute; override;
  private
    appFileDir: string;
    manualCheck: Boolean;
  public
    MainFromHandle: HWND;  //主线程句柄
    constructor Create(appFileDir: string; manualCheck: Boolean);
  end;

const {0x0400 - 0x7FFF}
  WM_UPDATE_UI1 = WM_USER + $1001;
  WM_UPDATE_UI2 = WM_USER + $1002;

var
  upgradeAppThread: TUpgradeAppThread;

implementation

constructor TUpgradeAppThread.Create(appFileDir: string; manualCheck: Boolean);
begin
  inherited Create(False);
  Self.appFileDir := appFileDir;
  Self.manualCheck := manualCheck;
end;

procedure TUpgradeAppThread.Execute;
var
  res: string;
  sData: TCopyDataStruct;
begin
  FreeOnTerminate := True;
  try
    res := upgradeApplication(appFileDir, False);
    if res = '0' then
    begin
      //未检测到完整版客户更新才进行dll更新检测
      res := upgradeDllOnline(appFileDir);
    end;

    if res = '0' then
    begin
      if Self.manualCheck then
      begin
        ShowMessage('博思客户端是最新版本,无需更新!');
      end;
    end
    else if res = BSERROR_NO_SERVCONF then
    begin
      if Self.manualCheck then
      begin
        ShowMessage('更新服务器地址为空!');
      end;
    end
    else if res = '2' then
      SendMessage(MainFromHandle, WM_UPDATE_UI2, 0, 0)  //向主线程发送dll更新消息
    else
    begin
      try
        sData.lpData := PChar(res);
        SendMessage(MainFromHandle, WM_UPDATE_UI1, 0, Cardinal(@sData));   //向主线程发客户端更新消息
      finally
//        FreeMem(sData.lpData);
      end;
    end;
  finally

  end;
end;

end.

  

{ 线程A接收消息 }
protected
    procedure WndProc(var Message: TMessage); override;

//创建线程B
upgradeAppThread := TUpgradeAppThread.Create(appFileDir, manualCheck);   //将检查更新放在线程中执行
  upgradeAppThread.MainFromHandle := Self.Handle;


procedure TfrmMain.WndProc(var Message: TMessage);  //接收线程消息
var
  param: TStringList;
  httpClient: TIdHTTP;
  controlUrl, res: string;
  appPath: string;
  cdds: TcopyDataStruct;
begin
  res := '';
  case Message.Msg of
    WM_UPDATE_UI1:   { 客户端更新消息 }
      begin
        res := '博思客户端助手需要更新到最新版本,需要关闭客户端才能更新,是否立即更新?';
        cdds := PcopyDataStruct(Message.LParam)^;
        appPath := StrPas(PChar(cdds.lpData));
        controlUrl := 'http://' + serverIp + ':' + IntToStr(StrToInt(serverPort) + 2) + '/upgradeMainApp?fp=' + appPath;
      end;
    WM_UPDATE_UI2:  { dll更新消息 }
      begin
        res := '检测到客户端组件更新,博思客户端助手需要重启才能更新,是否立即更新?';
        controlUrl := 'http://' + serverIp + ':' + IntToStr(StrToInt(serverPort) + 2) + '/controlMainApp?ct=2';
      end;
  else
    inherited;
  end;
  if res <> '' then
  begin
    try
      if MessageBox(Self.Handle, PChar(res), '询问', MB_ICONQUESTION + MB_YESNO + MB_TOPMOST + MB_DEFBUTTON2) = IDYES then
      begin
        param := TStringList.Create;
        httpClient := TIdHTTP.Create;
        controlUrl := StringReplace(controlUrl, ' ', '%20', [rfReplaceAll]);
        httpClient.Post(controlUrl, param);
      end;
    finally
      httpClient.Free;
      param.Free;
    end;
  end;
end;