更新进度条的方法

时间:2013-03-18 06:43:51

标签: nsis

我想在我的nsis安装程序中控制进度条。实际上我正在使用ThreadTimer插件,但我遇到了很大的问题。 ThreadTimer每10秒运行一次函数来更新进度条(将进度条值增加1%)。问题是它崩溃堆栈(因为我可以看到ThreadTimer使用与NSIS相同的堆栈)。 Crashes stack意味着当我想从堆栈中获取值时,由于ThreadTimer函数操作,该值是错误的。有任何想法吗?也许有其他方法来更新进度条?

这些是应该更新进度条的函数/宏。宏StartProgressBarIntervalUpdate开始更新进度条,宏StopProgressBarIntervalUpdate停止使用它。

Var /GLOBAL ProgressBarPosition
Var /GLOBAL ProgressBarParentWindow
Var /GLOBAL ProgressBarItem

Function InitProgressBar
    StrCpy $ProgressBarPosition "0"
    FindWindow $ProgressBarParentWindow "#32770" "" $HWNDPARENT
    GetDlgItem $ProgressBarItem $ProgressBarParentWindow 1004
FunctionEnd

Function UpdateProgressBarTimer
    ${If} $ProgressBarPosition >= 30000 ; 100% * 300
        StrCpy $ProgressBarPosition "0"
    ${Endif}
    IntOp $ProgressBarPosition $ProgressBarPosition + 300
    SendMessage $ProgressBarItem ${PBM_SETPOS} $ProgressBarPosition 0
FunctionEnd

!define StartProgressBarIntervalUpdate "!insertmacro StartProgressBarIntervalUpdate"
!macro StartProgressBarIntervalUpdate
    Call InitProgressBar
    GetFunctionAddress $UpdateProgressBarTimerFunctionAddress UpdateProgressBarTimer
    ThreadTimer::Start /NOUNLOAD 20 -1 $UpdateProgressBarTimerFunctionAddress
    Sleep 1000
!macroend

!define StopProgressBarIntervalUpdate "!insertmacro StopProgressBarIntervalUpdate"
!macro StopProgressBarIntervalUpdate
    ThreadTimer::Stop $UpdateProgressBarTimerFunctionAddress
    Sleep 15000
!macroend

以下是使用进度条的部分

Var /GLOBAL UpdateProgressBarTimerFunctionAddress
Section BeforeMoveData SEC01
    ${StartProgressBarIntervalUpdate}

    Call core.UnpackExeData
SectionEnd

Section OnMoveData SEC02    
    Call InstallFiles
    Call InstallRegistry
    Call InstallShortcuts

    ${StopProgressBarIntervalUpdate}

    ...

SectionEnd

0 个答案:

没有答案