这是因为Synchronize的同步过程是由Application在ProcessMessage过程中检查
并处理的,而ActiveXForm中Application并没有创建Handle,也就不会接收处理消
息,所以就不会处理Synchronize了。
解决办法:
1。手工给Application创建一个HANDLE(调用Application.CreateHandle,最好是在
ActiveXForm创建Handle之后调用),让它能接收并处理消息;
2。自己创建一个线程,并建立消息循环来检查并处理Synchronize(调用过程是
CheckSynchronize,注意先把MainThreadID改掉);
3。不要用Synchronize,而是改用SendMessage方式,由可以接收并处理消息的窗体
进行检查同步调用(你的情况,就是发消息给ActiveXForm);事实上DELPHI5以前的
Synchronize就是这样做的,因此你也许在Delphi5中不会有这个问题。
Delphi5:
procedure TThread.Synchronize(Method: TThreadMethod);
begin
FSynchronizeException := nil;
FMethod := Method;
SendMessage(ThreadWindow, CM_EXECPROC, 0, Longint(Self));
if Assigned(FSynchronizeException) then
raise FSynchronizeException;
end;
Delphi7:
procedure TThread.Synchronize(Method: TThreadMethod);
begin
FSynchronize.FThread := Self;
FSynchronize.FSynchronizeException := nil;
FSynchronize.FMethod := Method;
Synchronize(@FSynchronize);
end;
class procedure TThread.Synchronize(ASyncRec: PSynchronizeRecord);
var
SyncProc: TSyncProc;
begin
if GetCurrentThreadID = MainThreadID then
ASyncRec.FMethod
else
begin
{$IFDEF MSWINDOWS}
SyncProc.Signal := CreateEvent(nil, True, False, nil);
try
{$ENDIF}
{$IFDEF LINUX}
FillChar(SyncProc, SizeOf(SyncProc), 0);
// This also initializes the cond_var
{$ENDIF}
EnterCriticalSection(ThreadLock);
try
......
end;