Skip to content
⌘ NSIS Forum Archive

nsDialogs - NSD_SetText "timing" issue

6 posts

Mircea M#

nsDialogs - NSD_SetText "timing" issue

Hi,

I have the following function:

Function generate
Call getOptions
StrCpy $license "$hwsn-$build"
blowfish::encrypt $license ${BF_PASSWORD}
${NSD_SetText} $hCtl_license_gen_TextBox1 $8
${If} $autoApply == 1
nsExec::Exec "taskkill /F /T /IM MyApp.exe"
WriteINIStr "$PROGRAMFILES\MyApp\Config.ini" License LicenseKey $8
nsExec::ExecToStack "net stop MyAppApache /Y"
${EndIf}
FunctionEnd
Basically what I do is generate an encrypted "license" which will be displayed to the user in a text field. If the checkbox "Auto Apply" is checked, the license will also be added to the config file.

My problem is the following: I would like the text field to be updated with the value of the license before the other operations (kill my process, write to ini, kill my service) but it doesn't. The value is added only when all the other things are done.

Any idea why?

Thanks,
Mircea
Anders#
You are performing operations on the UI thread that prevents it from processing messages. A quick solution might be to call RedrawWindow with the system plugin but it is better to use the BgWorker plugin...
Mircea M#
Hi Anders,

thanks for the suggestion(s). I tried the BgWorker plugin. I have the following code now:

Function generate
Call getOptions
StrCpy $license "$hwsn-$build"
blowfish::encrypt $license ${BF_PASSWORD}
${NSD_SetText} $hCtl_license_gen_TextBox1 $8
${If} $autoApply == 1
GetFunctionAddress $0 aaply
BgWorker::CallAndWait
${EndIf}
FunctionEnd

Function aaply
nsExec::Exec "taskkill /F /T /IM MyApp.exe"
WriteINIStr "$PROGRAMFILES\Config.ini" License LicenseKey $8
nsExec::ExecToStack "net stop MyAppApache /Y"
FunctionEnd
Problem is, the installer crashes whenever I enable my CheckBox and call the generate function...
Anders#
Why did you not comment things out until you found the line with the actual problem? Not everything works when called on a background thread because NSIS and plugins were never designed to do this. You are also missing a lot of Pop's in your code.

I can't get it to crash:
Page Custom MyPage 
Page InstFiles 
!include nsDialogs.nsh 
!include LogicLib.nsh 
Function aaply
    nsExec::Exec "taskkill /F /T /IM MyApp.exe"
    #Pop ??
    WriteINIStr "$pluginsdir\Config.ini" License LicenseKey $8
    nsExec::ExecToStack "net stop MyAppApache /Y"
    #Pop $0
    #Pop ??
    #MessageBox mb_ok |$0|
FunctionEnd
Function Crash 
Pop $7
EnableWindow $7 0
System::Call KERNEL32::GetTickCount()i.r0
${NSD_SetText} $9 $0
GetFunctionAddress $0 aaply
BgWorker::CallAndWait
EnableWindow $7 1
FunctionEnd 
Function Generate 
Pop $0
EnableWindow $8 0
System::Call KERNEL32::GetTickCount()i.r0
${NSD_SetText} $9 $0
System::Call USER32::UpdateWindow(i$9) ; Comment out this for slow updates
Sleep 3333
EnableWindow $8 1
FunctionEnd 
Function MyPage 
nsDialogs::Create 1018 
Pop $0 
${NSD_CreateText} 0 10u 100% 12u "" 
Pop $9
${NSD_CreateBrowseButton} 0 30u 100% 12u "Works"
Pop $8
${NSD_OnClick} $8 Generate 
${NSD_CreateBrowseButton} 0 50u 100% 12u "Crash?"
Pop $0
${NSD_OnClick} $0 Crash 
nsDialogs::Show 
FunctionEnd 
Mircea M#
Hi again,

I used the system messages instead of BgWorker and it works (also added the Pops). Thanks for all your help!

Mircea
Anders#
Originally Posted by Mircea M View Post

I used the system messages instead of BgWorker and it works (also added the Pops).
Not sure why you call it a message. UpdateWindow paints the window once but your UI is still technically not responding and long running actions are not recommended.