{ TMainSync }
procedure TMainSync.Execute(argFunc:TCallback; arrArgs:array of const);
begin
Execute(TFuncCallStack.Create(argFunc, arrArgs));
end;
function TMainSync.Execute(argStk:TFuncCallStackBase):Pointer;
begin
EnterCriticalsection(lock);
fArgStk := argStk;
TThread.Queue(nil, @Sync);
if(GetCurrentThreadId <> MainThreadId)then
begin
BasicEventWaitForEvent(pEvt, -1);
end
else
begin
argStk.Call;
end;
result := argStk.ret;
argStk.Free;
LeaveCriticalsection(lock);
end;
procedure TMainSync.Sync;
begin
fArgStk.Call;
BasicEventSetEvent(pEvt);
end;
type
TCallBack = procedure() of object;
TCallback0Args = procedure() of object;
TCallback1Args = procedure(arg1:Pointer) of object;
TCallback2Args = procedure(arg1:Pointer; arg2:Pointer) of object;
TCallback3Args = procedure(arg1:Pointer; arg2:Pointer; arg3:Pointer) of object;
TCallback4Args = procedure(arg1:Pointer; arg2:Pointer; arg3:Pointer; arg4:Pointer) of object;
TCallback5Args = procedure(arg1:Pointer; arg2:Pointer; arg3:Pointer; arg4:Pointer; arg5:Pointer) of object;
TCallback6Args = procedure(arg1:Pointer; arg2:Pointer; arg3:Pointer; arg4:Pointer; arg5:Pointer; arg6:Pointer) of object;
TCallback7Args = procedure(arg1:Pointer; arg2:Pointer; arg3:Pointer; arg4:Pointer; arg5:Pointer; arg6:Pointer; arg7:Pointer) of object;
TCallback8Args = procedure(arg1:Pointer; arg2:Pointer; arg3:Pointer; arg4:Pointer; arg5:Pointer; arg6:Pointer; arg7:Pointer; arg8:Pointer) of object;
TCallback9Args = procedure(arg1:Pointer; arg2:Pointer; arg3:Pointer; arg4:Pointer; arg5:Pointer; arg6:Pointer; arg7:Pointer; arg8:Pointer; arg9:Pointer) of object;
TCallback10Args = procedure(arg1:Pointer; arg2:Pointer; arg3:Pointer; arg4:Pointer; arg5:Pointer; arg6:Pointer; arg7:Pointer; arg8:Pointer; arg9:Pointer; arg10:Pointer) of object;
{ TFuncCallStack }
procedure TFuncCallStack.Call;
begin
if(Pointer(PtrInt(cbFunc)) = nil)then
Exit;
case numArgs of
0: TCallback0Args(cbFunc)();
1: TCallback1Args(cbFunc)(ppArgs[0]);
2: TCallback2Args(cbFunc)(ppArgs[0], ppArgs[1]);
3: TCallback3Args(cbFunc)(ppArgs[0], ppArgs[1], ppArgs[2]);
4: TCallback4Args(cbFunc)(ppArgs[0], ppArgs[1], ppArgs[2], ppArgs[3]);
5: TCallback5Args(cbFunc)(ppArgs[0], ppArgs[1], ppArgs[2], ppArgs[3], ppArgs[4]);
6: TCallback6Args(cbFunc)(ppArgs[0], ppArgs[1], ppArgs[2], ppArgs[3], ppArgs[4], ppArgs[5]);
7: TCallback7Args(cbFunc)(ppArgs[0], ppArgs[1], ppArgs[2], ppArgs[3], ppArgs[4], ppArgs[5], ppArgs[6]);
8: TCallback8Args(cbFunc)(ppArgs[0], ppArgs[1], ppArgs[2], ppArgs[3], ppArgs[4], ppArgs[5], ppArgs[6], ppArgs[7]);
9: TCallback9Args(cbFunc)(ppArgs[0], ppArgs[1], ppArgs[2], ppArgs[3], ppArgs[4], ppArgs[5], ppArgs[6], ppArgs[7], ppArgs[8]);
10: TCallback10Args(cbFunc)(ppArgs[0], ppArgs[1], ppArgs[2], ppArgs[3], ppArgs[4], ppArgs[5], ppArgs[6], ppArgs[7], ppArgs[8], ppArgs[9]);
end;
end;