Inno setup Inno设置信号量非GUI阻塞
我有一个调用DLL的Inno安装脚本。 DLL启动一个线程,该线程最终调用Inno设置中的函数指针。 因为我不想把Inno脚本的逻辑改变太多,所以我想使用一个信号量或类似的东西 这里重要的一点是gui不应该被阻塞 这里是我的一段代码Inno setup Inno设置信号量非GUI阻塞,inno-setup,semaphore,Inno Setup,Semaphore,我有一个调用DLL的Inno安装脚本。 DLL启动一个线程,该线程最终调用Inno设置中的函数指针。 因为我不想把Inno脚本的逻辑改变太多,所以我想使用一个信号量或类似的东西 这里重要的一点是gui不应该被阻塞 这里是我的一段代码 procedure InstallData(); var arrComponents : TStringList; i, index, p : Integer; countComp
procedure InstallData();
var
arrComponents : TStringList;
i, index, p : Integer;
countComp : Integer;
begin
countComp := ICountComponents();
pbState.Max:= countComp;
arrComponents := IGetComponentsToInstall();
pbState.Max := countComp;
for i := 0 to countComp-1 do
begin
// lock semaphore
pbState.Position := i;
p := Pos(' ', arrComponents[i]);
if p > 0 then
begin
//Unzip component
//Call the DLL
end
else
begin
//unzip something else
//Call the DLL
end
end
end;
procedure ProgressCallback(progress:Integer);
begin
pbStateZip.Position:= progress;
//if progress = 100
// unlock semaphore
//
end;
是否有信号量或与此等效的信号量不会阻止我的GUI?因此,您希望在Inno设置中等待同步对象,而不会阻止UI?如果是这样的话,那么这对我来说就没有什么意义了,因为你正在进行回调。在DLL中创建一个线程,完成工作,调用回调函数。这是我可以想象的场景。回调用于返回进度,所以当进度达到100%时,信号量应该被释放。我同意更改算法也可以,但我不想更改进行解压缩的for循环;主UI线程的消息泵不得被任何同步函数调用阻止,以保持UI活动。对于那个信号量信号,你需要等待。我至少可以想到3种可能的选择,1。添加某种类型的已完成事件calback委托,2。找到一个异步等待机制,3。在安装程序中创建一个等待线程,或者创建一个带有虚拟消息循环的窗口,然后切换到Windows消息传递。当然,这3个选项都有,但我希望有一个信号量:/。好的,我将尝试实现这三种方法中的一种。到目前为止,谢谢你:我没有说过你不能使用信号灯:选项2和3只是关于异步等待的建议,例如在信号灯上。无论如何,您不能从工作线程访问UI控件,因此,如果您从工作线程调用该回调,请非常小心在ProgressCallback函数中执行的操作。