Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
тебе нужно просто подсчитать разницу во времени? »
Главное, не подсчитать, а отображать отсчёт реального время с нулевого момента старта и до стоп момента.
Т.е. идёт процесс - наглядно отображается время с нуля-начала процесса.
Процесс закончился - отображение исчезло (+ , если возможно, заненсение результата в переменную)
Главное, не подсчитать, а отображать отсчёт реального время с нулевого момента старта и до стоп момента. »
а, ну тогда здесь нужно отдельный поток создавать...
Попробуй плагин ThreadTimer plug-in (http://nsis.sourceforge.net/ThreadTimer_plug-in), там в callback функции пропиши определение времени, затем сообщения "WM_SETTEXT" на элемент, который будет таймер отображать
Сам не пробовал (сейчас времени нет), чисто теория :)
плагин ThreadTimer plug-in »
И это не то... Он не реальное время отсчитывает, а просто циферки...
Может как то самим организовать отсчёт ? : для минут и секунд заявим 3 переменные, которые будут обозначать разряды времени :
$1 - десятки минут ( от 0 до 5 ), $2 - единицы минут (от 0 до 9), $3 - "сдвоенный" разряд, отсчёта секунд от 00 до 59. (или всё же лучше разделить разряды секунд на десятки и единицы ? Но по моему не обязательно...)
и начнём посекундный отсчёт, с занесением ( и одновременно отображением) значений в эти переменные по следующей логике :
как только отсчёт секунд достигнет 59, через следующую секунду $3 обнуляется до 00 , а в $2 - разряда единиц минут заносится - 1, и отсчёт секунд начинается вновь c 00 до 59
Когда цикл счёта секунд до 59+1 вновь завершится, к единицам минут добавится ещё единичка и так до 9, после чего добавляется единица в разряд десятков минут, т.е. в $1.
И так до достижения 59 мин 59 секунд. А больше вообщем то и не надо, и такое то значение вряд ли когда понадобится на практике...
(хотя в идеале часы тоже надо бы учесть...)
И это не то... Он не реальное время отсчитывает, а просто циферки... »
Да гад ты, всё-таки заставил меня написать код :biggrin:
Я тебе его дал для создания отдельного потока, без которого обновлять элементы (менять циферки, пока идёт распаковка файлов к примеру) не получится
Короче вот смотри код, смотри на заголовок окна ;) А там уже добавишь высчитывание диапазона времени, если нужно (плагином Time plug-in (http://nsis.sourceforge.net/Time_plug-in))
; Script generated by the HM NIS Edit Script Wizard.
; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "Моя программа"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "Моя компания, LLC."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
; MUI 1.67 compatible ------
!include "MUI.nsh"
!include WinMessages.nsh
XPStyle on
; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
; Welcome page
!insertmacro MUI_PAGE_WELCOME
; Directory page
#!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!insertmacro MUI_PAGE_FINISH
; Language files
!insertmacro MUI_LANGUAGE "Russian"
!include "FileFunc.nsh"
!insertmacro GetTime
var day
var month
var year
var name_day
var hour
var minute
var seconds
var HWND_Timer
; MUI end ------
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "setup.exe"
InstallDir "$TEMP"
ShowInstDetails show
; Получаем Handle
Section -TEST
#GetDlgItem $HWND_Timer $HWNDPARENT 1028
#SendMessage $HWND_Timer ${WM_SETTEXT} "" "STR:TEST"
GetFunctionAddress $0 FuncTimer
ThreadTimer::Start /NOUNLOAD 1000 -1 $0
SectionEnd
Function FuncTimer
${GetTime} "" "L" $day $month $year $name_day $hour $minute $seconds
SendMessage $HWNDPARENT ${WM_SETTEXT} "" "STR:$hour:$minute:$seconds"
FunctionEnd
Section
sleep 2000
SectionEnd
Section
sleep 100
SectionEnd
Section
sleep 300
SectionEnd
Section
sleep 499
SectionEnd
Section
sleep 5000
SectionEnd
Section
sleep 100
SectionEnd
Section
sleep 2000
SectionEnd
Section
sleep 300
SectionEnd
Section
sleep 100
SectionEnd
Section -Post
SectionEnd
Это тебе как в пример, блин пока писал, ты тут понаписал много чего про цифры :lol:
Сейчас прочитаю и вникну в суть
---
Может как то самим организовать отсчёт ? : для минут и секунд заявим 3 переменные, которые будут обозначать разряды времени :
$1 - десятки минут ( от 0 до 5 ), $2 - единицы минут (от 0 до 9), $3 - "сдвоенный" разряд, отсчёта секунд от 0 до 59.
и начнём посекундный отсчёт, с занесением ( и одновременно отображением) значений в эти переменные по следующей логике :
как только отсчёт секунд достигнет 59, через следующую секунду $3 обнуляется до 00 , а в $2 - разряда единиц минут заносится - 1, и отсчёт секунд начинается вновь c 00 до 59
Когда цикл счёта секунд до 59+1 вновь завершится, к единицам минут добавится ещё единичка и так до 9, после чего добавляется единица в разряд десятков минут, т.е. в $1.
И так до достижения 59 мин 59 секунд. А больше вообщем то и не надо, и такое то значение вряд ли когда понадобится на практике...
(хотя в идеале часы тоже надо бы учесть...) »
ё-моё, разве тот варинат, который я предложил, не устраивает???
Тот плагин "Time", там можно подсчитать разницу во времени, т.е. смотри:
запускается инсталлер - команда определения времени
в той функции, которую я тебе выше написал (для отображения часов в реальном времени) там прописываем команду на математическую операцию (из текущего времени вычитаем то, которое было на момент запуска инсталлера) и таким образом получаем то время, которое работает инсталлер на текущий момент
Решил изобрести велосипед?? :)
K.A.V.,
Не, мы кажись не поняли друг друга...
Сначала. Чего я хотел : идёт процесс (или не идёт, всё равно) , в окне инсталлера наблюдаем оконце с таймером, который я запускаю как душе угодно. Или вовсе автономно или когда начнётся процесс установки.
Таймер после запуска начинает отсчёт с 00:00. Ключевой момент - от 00: 00. Для начала - всё. Вот, как то так... :)
MKN, да блин, какая разница то? Используй плагин time и делай математическую операцию :biggrin:
Ведь всё к одному и тому-же сходится один фиг :yes:
Держи, дружище ;)
Копайся :drug:
!include "MUI2.nsh"
!include "FileFunc.nsh"
!include "LogicLib.nsh"
!include "WinMessages.nsh"
!include "nsDialogs.nsh"
!include "FileFunc.nsh"
!insertmacro GetTime
var day
var month
var year
var name_day
var hour
var minute
var seconds
var S_day
var S_month
var S_year
var S_name_day
var S_hour
var S_minute
var S_seconds
!include "Time.nsh"
Page custom func
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
Name "TEST.exe"
Caption "TEST.exe"
OutFile "TEST.exe"
ShowInstDetails show
XPStyle on
Var dlg
Var RadioButton1
Var RadioButton2
Var CheckBox
Var Label
Var button
var TimerStarted
Function func
nsDialogs::Create 1018
pop $0
GetDlgItem $0 $HWNDPARENT 1037
SendMessage $0 ${WM_SETTEXT} 0 "STR:Мой текст строки №1"
GetDlgItem $0 $HWNDPARENT 1038
SendMessage $0 ${WM_SETTEXT} 0 "STR:Мой текст строки №2"
${NSD_CreateButton} 25u 27u 150u 15u "Жми давай!"
pop $button
${NSD_OnClick} $button StartTimer
${NSD_CreateLabel} 0 5u 200u 200u "Здесь будет времечко ;)"
pop $Label
GetFunctionAddress $0 FuncTimer
ThreadTimer::Start /NOUNLOAD 1000 -1 $0
nsDialogs::Show
FunctionEnd
Function StartTimer
# Добавил переменную, потому что при старте сразу идёт отображение времени
StrCpy $TimerStarted 1
${GetTime} "" "L" $S_day $S_month $S_year $S_name_day $S_hour $S_minute $S_seconds
GetFunctionAddress $0 FuncTimer
ThreadTimer::Start 1000 -1 $0
FunctionEnd
Function FuncTimer
# Добавил переменную, потому что при старте сразу идёт отображение времени
StrCmp $TimerStarted "1" +2 0
abort
SendMessage $button ${WM_SETTEXT} "" "STR:Жми ещё для сброса таймера!"
${GetTime} "" "L" $day $month $year $name_day $hour $minute $seconds
${time::MathTime} "second($day.$month.$year $hour:$minute:$seconds) - second($S_day.$S_month.$S_year $S_hour:$S_minute:$S_seconds) =date" $0
StrCpy $0 $0 "" -8 ; Здесь мы отсекаем строку даты, оставляя только часы/минуты/секунды
SendMessage $Label ${WM_SETTEXT} "" "STR:Время: $hour:$minute:$seconds (с момента запуска прошло: $0)"
FunctionEnd
Section
;SetAutoClose true
SectionEnd
K.A.V.,
Однако, как хитро запутанно... :) Благодарю !
Здравствуйте! Нижепредставленый код загружает в RichDesc содержимое из rtf файла. Но на компьютере конечного пользователя требуется наличие этого файла.
Можно ли его при компиляции также прикрепить этот файл и загружать его в RichDesc из инсталлятора, а не из папки?
Это для того, чтобы не таскать вместе с инсталлятором rtf файлы.
nsDialogs::CreateControl "RichEdit20A" ${ES_READONLY}|${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN} ${WS_EX_CLIENTEDGE} 0 15u 100% 120u''
pop $RichDesc
${LoadRTF} readme.rtf $RichDesc
Заранее спасибо
kotkovets
17-02-2013, 00:51
этот файл и загружать его в RichDesc из инсталлятора, а не из папки? »
точно также, как и файлы в установщик добавляете..
но можно во временную папку для работы плагов (установщик автоматом создает и по завершении работы подчищает)
InitPluginsDir
SetOutPath "$PluginsDir"
File "readme.rtf"
${LoadRTF} "$PluginsDir\readme.rtf" $RichDesc
Lex_from_Belarus
17-02-2013, 20:48
Подскажите что я делаю не так. Есть код:
!include "FileFunc.nsh"
Var prog
Section "Program"
SectionIn 1
ReadRegStr $0 HKLM "Software\microsoft\windows\currentversion\uninstall\Program" "UninstallString"
${GetParent} "$0" $prog
IfFileExists $prog\Uninstall.exe 0 +2
Goto ok
ReadRegStr $0 HKLM "Software\wow6432node\microsoft\windows\currentversion\uninstall\Program" "UninstallString"
${GetParent} "$0" $prog
IfFileExists $prog\Uninstall.exe 0 +2
Goto ok
SetOutPath $INSTDIR
File /r "${pkgdir}\Program.exe"
ExecWait "$INSTDIR\Program.exe /S"
ok:
SectionEnd
Этим кодом я хочу проверить установлена ли библиотека и если нет, то установить. В UninstallString прописан путь к Uninstaller программы полностью вместе с файлом, поэтому использую ${GetParent}, чтобы отсечь Uninstall.exe и получить просто путь, ну а далее проверка есть лигтштыефдд в папке, если есть значит пропустить, но почему-то этот код не катит, постоянно идёт установка, хотя по пути в реестре всё есть. Проверка в реестре 2 раза, т.к. при установке в 32 битной и 64 битной системе путь в реестре разный.
kotkovets
18-02-2013, 00:34
использую ${GetParent}, чтобы отсечь Uninstall.exe »
ну и нахрен это делать, если потом по коду дописывается Uninstall.exe... тупо...
Lex_from_Belarus, че за хрень, а не нормальный код..
IfFileExists $prog\Uninstall.exe 0 +2
Goto ok
че так не написать, что означает, если есть Uninstall.exe, то пропустить ниже по коду 4 команды, относительно процедуры IfFileExists
IfFileExists $prog\Uninstall.exe +4
SetOutPath $INSTDIR
File /r "${pkgdir}\Program.exe"
ExecWait "$INSTDIR\Program.exe /S"
Заодно, для отладки кода, проверяется, а какой путь, содержимое переменной: "$0"
MessageBox MB_OK "$$0 = $0" IDOK
Справку читайте на русском языке, где все расписано..
Lex_from_Belarus
18-02-2013, 10:40
IfFileExists $prog\Uninstall.exe +4
ну и как вы себе это представляете?
я же написал что в uninstallstring в реестре хранится путь с фалом, т.е, например c:\program files\program\uninstall.exe.
MessageBox вставляю для проверки везде пишет всё ОК, т.е. и реестр правильно читает и отсекает в пути имя файла, т.е. оставляет просто путь, но вот после ifFileExists идёт дальше а не перескакивает на ОК, как буд-то ifFileExists не срабатывает, т.е. всё остальное проходит, а на ifFileExists косяк.
Возвращаясь к таймеру...
Время исполнения кода можно подсчитывать и таким способом, с помощью функции GetTickCount :
OutFile "Elapsed Time.exe"
Section
System::Call 'kernel32::GetTickCount(v)i.r0'
; код
Sleep 1200
System::Call 'kernel32::GetTickCount(v)i.r1'
IntOp $0 $1 - $0
IntOp $1 $0 / 1000
IntOp $0 $0 % 1000
IntOp $2 $1 / 60
IntOp $1 $1 % 60
IntOp $3 $2 / 60
IntOp $2 $2 % 60
MessageBox MB_OK "Elapsed Time $3 hours $2 min $1 sec $0 ms"
SectionEnd
Миллисекунды могут "гулять" в мизерном диапазоне...
Вопрос : возможно ли при этом способе визуализировать отсчёт времени в процессе выполнения кода ?
Время исполнения кода можно подсчитывать и таким способом, с помощью функции GetTickCount »
У меня при таком раскладе показывает сколько Windows работает с момента запуска :)
Вопрос : возможно ли при этом способе визуализировать отсчёт времени в процессе выполнения кода ? »
Для кастомных страниц конечно легко визуализировать или необходимо на стандартных?
У меня при таком раскладе показывает сколько Windows работает с момента запуска »
Так не должно быть, ведь в начале берется время работы windows и потом после паузы снова берется время работы. После чего из второго вычитается первое и преобразовывается в формат часы, минуты, секунды.
У меня так работает с маленьким расхождением в миллисекундах.
Для кастомных страниц конечно легко визуализировать »
Для кастомных. Как это будет выглядеть ?
показывает сколько Windows работает с момента запуска »
Странно...
А если с выделением-очисткой памяти :
System::Alloc 400
pop $2
System::Call 'kernel32::GetTickCount()i .r0'
System::Free $2
Странно... »
У меня команда была забита в onInit функции (забивал в предыдущий пример с отображением времени в заголовке) :)
Если в секции с паузой, то всё норм
Для кастомных. Как это будет выглядеть ? »
Ну как то так на мой взгляд, дальше по воображению можно поставить значение куда угодно. Это лишь пример как использовать.
!include nsDialogs.nsh
OutFile "Time.exe"
Var Stime
Var Ttime
Var DIALOG
Var TEXT
Page custom Time TimeEnd
Function .onInit
System::Call 'kernel32::GetTickCount(v)i.r0'
StrCpy $Stime $0
FunctionEnd
Function Time
nsDialogs::Create 1018
Pop $DIALOG
${NSD_CreateLabel} 10u 10u 100% 10u "Прошло $3 часов $2 минут $1 секунд"
Pop $TEXT
${NSD_CreateTimer} ChekTime 100
nsDialogs::Show
FunctionEnd
Function TimeEnd
${NSD_KillTimer} ChekTime
FunctionEnd
Function ChekTime
System::Call 'kernel32::GetTickCount(v)i.r1'
IntOp $0 $1 - $Stime
IntOp $1 $0 / 1000
IntOp $0 $0 % 1000
IntOp $2 $1 / 60
IntOp $1 $1 % 60
IntOp $3 $2 / 60
IntOp $2 $2 % 60
StrCpy $Ttime "Прошло $3 часов $2 минут $1 секунд"
${NSD_SetText} $TEXT "$Ttime"
FunctionEnd
Section
SectionEnd
Вот еще набросал примерчик для стандартной функций установки используя плагин ThreadTimer (http://nsis.sourceforge.net/ThreadTimer_plug-in) для создания параллельного потока . В принципе куда угодно можно отобразить время.
OutFile "Time2.exe"
!include "MUI.nsh"
Var Stime
Var Ttime
!insertmacro MUI_PAGE_INSTFILES
Function .onInit
System::Call 'kernel32::GetTickCount(v)i.r0'
StrCpy $Stime $0
GetFunctionAddress $1 ChekTime
ThreadTimer::Start 100 -1 $1
FunctionEnd
Section
DetailPrint "Команда 1"
Sleep 10000
DetailPrint "Команда 2"
Sleep 10000
DetailPrint "Команда 3"
Sleep 10000
DetailPrint "Команда 4"
Sleep 10000
ThreadTimer::Stop
SectionEnd
Function ChekTime
System::Call 'kernel32::GetTickCount(v)i.r1'
IntOp $0 $1 - $Stime
IntOp $1 $0 / 1000
IntOp $0 $0 % 1000
IntOp $2 $1 / 60
IntOp $1 $1 % 60
IntOp $3 $2 / 60
IntOp $2 $2 % 60
StrCpy $Ttime "Прошло $3 часов $2 минут $1 секунд"
!insertmacro MUI_HEADER_TEXT "Установка" "$Ttime"
FunctionEnd
Подскажите что я делаю не так. Есть код: »
Правильно вам делали замечания, пишите проще что бы самому не запутаться. И желательно изучите логические конструкции в русском справочнике, пригодиться еще не раз.
!include LogicLib.nsh
Section "Program"
SectionIn 1
ReadRegStr $0 HKLM "Software\microsoft\windows\currentversion\uninstall\Program" "UninstallString"
ReadRegStr $1 HKLM "Software\wow6432node\microsoft\windows\currentversion\uninstall\Program" "UninstallString"
${IfNot} ${FileExists} "$0"
${AndIfNot} ${FileExists} "$1"
SetOutPath $INSTDIR
File /r "${pkgdir}\Program.exe"
ExecWait "$INSTDIR\Program.exe /S"
${EndIf}
SectionEnd
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC