一种通过在 NSIS 安装程序中进行计算的函数来警告用户有点冻结的方法

A way to warn the user about a little freeze by a function doing calculations in a NSIS installer

我正在编写我的第一个 NSIS 脚本,但我发现了一个障碍。事实上,我认为仅在标题中很难解释,(也许有人可以帮助解决这个问题)所以让我充分解释一下:

我正在创建一个使用一些自定义页面的安装程序,因为我希望用户先 select 一些选项(它使用 nsDialogs),然后根据这些选项对安装路径进行一些调整(主要是自动检测它,因为它可能取决于其他事物)。所有这些都工作正常。

在该选项的某些情况下,在检查某些文件是否存在之间,它会散列一个文件以查看该文件是否是它期望的文件(因为稍后它将用增量修补它)。我用了 Crypto plugin or MD5 plugin,两者都很好,都做我想做的,但他们挂起安装程序一段时间(一秒钟左右),我想是因为文件有点大(大约超过 100MB)并且这就是问题所在。

通常在这些情况下,您 select 选项,转到下一个(自定义)页面,并在自定义页面的 creator 函数 中自动检测文件夹,它直接进行文件检查,当检查文件哈希时,它挂起一秒钟并继续,但一直挂起它只显示一个空白页,因为它还没有到达创建者函数 nsDialogs::Show 指令显示 window 内容。在该页面中,您可以更改文件夹,如果是这种情况,一旦更改,它会再次运行检查(这是在两种情况下都调用的专用函数)并再次挂起,但随后 window显示一切,我可以设置一个文本来表达一些东西(事实上,这是我首先做的),但是第一次自动我不能这样做。

这就是重点:如何向用户展示一些东西让他们知道安装程序正在执行哈希计算,而不是仅显示空白 window.

我尝试或想做的事情:

如果主题不是很好理解,明天我可以添加一个从头开始创建的小示例来说明这一点,因为我的主要测试太大了,没有必要将所有内容都粘贴到这里。

谢谢!

编辑:

这是有问题的原始示例(不要忘记添加标记的大文件的路径):

Name "Example HASH Freeze"
Outfile "ExampleHASHFreeze.exe"

RequestExecutionLevel user
Unicode True
XPStyle on

!include nsDialogs.nsh
!include LogicLib.nsh

Page Custom FirstCreate
Page Custom SecondCreate
Page instfiles

var file
var hash
var info

Function FirstCreate

    StrCpy $file "" ; Add a path to a big file to do the hash. 150 MB or more.
    
    nsDialogs::Create 1018
    ${NSD_CreateLabel} 0u 64u 100% 12u "Hashing: $file"
    nsDialogs::Show
FunctionEnd

Function SecondCreate
    
    StrCpy $hash "hashing..."

    nsDialogs::Create 1018
    ${NSD_CreateLabel} 0u 58u 100% 12u "Hashing: $file"
    ${NSD_CreateLabel} 0u 70u 100% 12u "Hash: $hash"
    Pop $info

    call hashFile
    
    nsDialogs::Show
FunctionEnd

Function hashFile
    ${If} ${FileExists} "$file"
        md5dll::GetMD5File "$file"  ; Using MD5 Plugin
        ; Crypto::HashFile "MD5" "$file" ; Using Crypto Plugin
        Pop [=10=]
        ${NSD_SetText} $info "Hash: [=10=]" 
    ${Else}
        ${NSD_SetText} $info "Hash: FILE NOT FOUND" 
    ${EndIf}
FunctionEnd

Section
    MessageBox MB_OK "Hello world!"
SectionEnd

但是,根据 Anders 使用横幅插件的提示(这正是我正在搜索的!),以及 BgWorker plugin 使用 nsDialogs 计时器,nsDialogs 呈现 window,同时它会显示一个横幅,所以现在看起来很完美! (不要忘记添加标记的大文件路径)。

Name "Example HASH Freeze Fix"
Outfile "ExampleHASHFreezeFix.exe"

RequestExecutionLevel user
Unicode True
XPStyle on

!include nsDialogs.nsh
!include LogicLib.nsh

Page Custom FirstCreate
Page Custom SecondCreate
Page instfiles

var file
var hash
var info

Function FirstCreate

    StrCpy $file "" ; Add a path to a big file to do the hash. 150 MB or more.
    
    nsDialogs::Create 1018
    ${NSD_CreateLabel} 0u 64u 100% 12u "Hashing: $file"
    nsDialogs::Show
FunctionEnd

Function SecondCreate
    
    StrCpy $hash "hashing..."

    nsDialogs::Create 1018
    ${NSD_CreateLabel} 0u 58u 100% 12u "Hashing: $file"
    ${NSD_CreateLabel} 0u 70u 100% 12u "Hash: $hash"
    Pop $info
    
    GetFunctionAddress [=11=] onShow_hack
    nsDialogs::CreateTimer [=11=] 1
    
    nsDialogs::Show
FunctionEnd

Function hashFile
    ${If} ${FileExists} "$file"
        Banner::show "Calculating Hash..."
        md5dll::GetMD5File "$file"  ; Using MD5 Plugin
        ; Crypto::HashFile "MD5" "$file" ; Using Crypto Plugin
        Pop [=11=]
        Banner::destroy
        ${NSD_SetText} $info "Hash: [=11=]" 
    ${Else}
        ${NSD_SetText} $info "Hash: FILE NOT FOUND" 
    ${EndIf}
FunctionEnd

Function onShow_hack
    GetFunctionAddress [=11=] ${__FUNCTION__}
    nsDialogs::KillTimer [=11=]
    GetFunctionAddress [=11=] hashFile
    BgWorker::CallAndWait
FunctionEnd

Section
    MessageBox MB_OK "Hello world!"
SectionEnd

也许它应该在计算尚未完成的同时禁用按钮,但这些事情很容易。谢谢!

您真的不应该在自定义页面上做繁重的工作。您可以使用 BgWorker plug-in 进行后台工作。将它与计时器 hack 结合起来,你会得到这个:

!include nsDialogs.nsh

Page Custom mypage

Function hashfile
Crypto::HashFile "MD5" "$somefilepath"
Pop [=10=]
MessageBox "" [=10=]
FunctionEnd

Function onShow_hack
GetFunctionAddress [=10=] ${__FUNCTION__}
nsDialogs::KillTimer [=10=]
GetFunctionAddress [=10=] hashfile
BgWorker::CallAndWait
FunctionEnd

Function mypage
nsDialogs::Create 1018
Pop [=10=]
${NSD_CreateButton} 0 13u 100% 12u "I do nothing"
Pop [=10=]
GetFunctionAddress [=10=] onShow_hack
nsDialogs::CreateTimer [=10=] 1
nsDialogs::Show
FunctionEnd

Section
SectionEnd

横幅插件允许您显示叠加消息...