Inno setup 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

我有一个调用DLL的Inno安装脚本。 DLL启动一个线程,该线程最终调用Inno设置中的函数指针。 因为我不想把Inno脚本的逻辑改变太多,所以我想使用一个信号量或类似的东西

这里重要的一点是gui不应该被阻塞

这里是我的一段代码

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函数中执行的操作。