0

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
4

0 に答える 0