在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;