一种通过在 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.
我尝试或想做的事情:
- 使用 nsDialogs,因为它首先进行了计算,直到后来才到达 nsDialogs::Show,所以我无法在 window 中显示任何内容那时(或者,至少,是我在我找到的所有文档中读到的)。而且,正如文档所说并经过测试,当您按下一个或后退按钮时,您在 nsDialogs::Show 指令之后放置的所有内容都会执行。
- 看到 nsDialogs 起初似乎不是可行的方法,我正在搜索是否可以在安装 window 上方显示 window(类似于 MessageBox)并自动关闭它,分别在哈希计算前后,只显示带有“请稍候”或类似的文本。但是我没有找到办法。
- 也许可以使用计时器并在完成几毫秒后进行检查,但在我看来这是一种非常便宜的方式来完成一些等待发生的问题,主要是因为取决于机器速度,这是我只能在万不得已的情况下使用 nsDialogs::Show 首先显示 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
横幅插件允许您显示叠加消息...
我正在编写我的第一个 NSIS 脚本,但我发现了一个障碍。事实上,我认为仅在标题中很难解释,(也许有人可以帮助解决这个问题)所以让我充分解释一下:
我正在创建一个使用一些自定义页面的安装程序,因为我希望用户先 select 一些选项(它使用 nsDialogs),然后根据这些选项对安装路径进行一些调整(主要是自动检测它,因为它可能取决于其他事物)。所有这些都工作正常。
在该选项的某些情况下,在检查某些文件是否存在之间,它会散列一个文件以查看该文件是否是它期望的文件(因为稍后它将用增量修补它)。我用了 Crypto plugin or MD5 plugin,两者都很好,都做我想做的,但他们挂起安装程序一段时间(一秒钟左右),我想是因为文件有点大(大约超过 100MB)并且这就是问题所在。
通常在这些情况下,您 select 选项,转到下一个(自定义)页面,并在自定义页面的 creator 函数 中自动检测文件夹,它直接进行文件检查,当检查文件哈希时,它挂起一秒钟并继续,但一直挂起它只显示一个空白页,因为它还没有到达创建者函数 nsDialogs::Show 指令显示 window 内容。在该页面中,您可以更改文件夹,如果是这种情况,一旦更改,它会再次运行检查(这是在两种情况下都调用的专用函数)并再次挂起,但随后 window显示一切,我可以设置一个文本来表达一些东西(事实上,这是我首先做的),但是第一次自动我不能这样做。
这就是重点:如何向用户展示一些东西让他们知道安装程序正在执行哈希计算,而不是仅显示空白 window.
我尝试或想做的事情:
- 使用 nsDialogs,因为它首先进行了计算,直到后来才到达 nsDialogs::Show,所以我无法在 window 中显示任何内容那时(或者,至少,是我在我找到的所有文档中读到的)。而且,正如文档所说并经过测试,当您按下一个或后退按钮时,您在 nsDialogs::Show 指令之后放置的所有内容都会执行。
- 看到 nsDialogs 起初似乎不是可行的方法,我正在搜索是否可以在安装 window 上方显示 window(类似于 MessageBox)并自动关闭它,分别在哈希计算前后,只显示带有“请稍候”或类似的文本。但是我没有找到办法。
- 也许可以使用计时器并在完成几毫秒后进行检查,但在我看来这是一种非常便宜的方式来完成一些等待发生的问题,主要是因为取决于机器速度,这是我只能在万不得已的情况下使用 nsDialogs::Show 首先显示 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
横幅插件允许您显示叠加消息...