Delphi动态库中如何调用 Application.ProcessMessages

admin 2021-10-25 233353

在Delphi动态库中,如果执行长耗时代码,可能会导致主界面卡死,如果是在主程序中,可以调用 Application.ProcessMessages来解决, 但如果没有传 Application 给DLL,则无法调用。可以通过下面方法解决:

一、先定义一个函数

Procedure DoEvents; {poor mans Application.Processmessages}
var
Msg : TMsg;
begin
  while PeekMessage(Msg,0,0,0,PM_REMOVE) do begin
      if (Msg.Message = $0012) then begin
         exit;
      end;
      TranslateMessage(Msg);
      DispatchMessage(Msg);
  end;
end;


二、在长耗时的代码前调用 DoEvents:

function SearchStr(ASrcStr, ASearchStr: PChar;  AProc: TFarProc): Integer; StdCall;
var
  FindStr: PChar;
begin
  FindStr := ASrcStr;
  FindStr := StrPos(FindStr, ASearchStr);
  while FindStr <> nil do
  begin
    if AProc <> nil then
      TFoundStrProc(AProc)(FindStr);      //调用回调函数
    FindStr := FindStr + 1;
    FindStr := StrPos(FindStr, ASearchStr);
//    Application.ProcessMessages;
    DoEvents();  //调用DoEvents
    Sleep(500)
  end;
  Result := 100;
end;




最新回复 (0)
返回