PDA

Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 [14] 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

MKN
16-02-2013, 11:30
тебе нужно просто подсчитать разницу во времени? »
Главное, не подсчитать, а отображать отсчёт реального время с нулевого момента старта и до стоп момента.
Т.е. идёт процесс - наглядно отображается время с нуля-начала процесса.
Процесс закончился - отображение исчезло (+ , если возможно, заненсение результата в переменную)

K.A.V.
16-02-2013, 11:52
Главное, не подсчитать, а отображать отсчёт реального время с нулевого момента старта и до стоп момента. »
а, ну тогда здесь нужно отдельный поток создавать...
Попробуй плагин ThreadTimer plug-in (http://nsis.sourceforge.net/ThreadTimer_plug-in), там в callback функции пропиши определение времени, затем сообщения "WM_SETTEXT" на элемент, который будет таймер отображать
Сам не пробовал (сейчас времени нет), чисто теория :)

MKN
16-02-2013, 12:01
плагин 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 секунд. А больше вообщем то и не надо, и такое то значение вряд ли когда понадобится на практике...
(хотя в идеале часы тоже надо бы учесть...)

K.A.V.
16-02-2013, 12:37
И это не то... Он не реальное время отсчитывает, а просто циферки... »
Да гад ты, всё-таки заставил меня написать код :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", там можно подсчитать разницу во времени, т.е. смотри:
запускается инсталлер - команда определения времени
в той функции, которую я тебе выше написал (для отображения часов в реальном времени) там прописываем команду на математическую операцию (из текущего времени вычитаем то, которое было на момент запуска инсталлера) и таким образом получаем то время, которое работает инсталлер на текущий момент
Решил изобрести велосипед?? :)

MKN
16-02-2013, 12:49
K.A.V.,
Не, мы кажись не поняли друг друга...
Сначала. Чего я хотел : идёт процесс (или не идёт, всё равно) , в окне инсталлера наблюдаем оконце с таймером, который я запускаю как душе угодно. Или вовсе автономно или когда начнётся процесс установки.
Таймер после запуска начинает отсчёт с 00:00. Ключевой момент - от 00: 00. Для начала - всё. Вот, как то так... :)

K.A.V.
16-02-2013, 13:27
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

MKN
16-02-2013, 13:36
K.A.V.,
Однако, как хитро запутанно... :) Благодарю !

Awral
17-02-2013, 00:13
Здравствуйте! Нижепредставленый код загружает в 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 косяк.

MKN
18-02-2013, 11:43
Возвращаясь к таймеру...
Время исполнения кода можно подсчитывать и таким способом, с помощью функции 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

Миллисекунды могут "гулять" в мизерном диапазоне...
Вопрос : возможно ли при этом способе визуализировать отсчёт времени в процессе выполнения кода ?

K.A.V.
18-02-2013, 15:31
Время исполнения кода можно подсчитывать и таким способом, с помощью функции GetTickCount »
У меня при таком раскладе показывает сколько Windows работает с момента запуска :)

profcom
18-02-2013, 15:42
Вопрос : возможно ли при этом способе визуализировать отсчёт времени в процессе выполнения кода ? »
Для кастомных страниц конечно легко визуализировать или необходимо на стандартных?

У меня при таком раскладе показывает сколько Windows работает с момента запуска »
Так не должно быть, ведь в начале берется время работы windows и потом после паузы снова берется время работы. После чего из второго вычитается первое и преобразовывается в формат часы, минуты, секунды.
У меня так работает с маленьким расхождением в миллисекундах.

MKN
18-02-2013, 16:39
Для кастомных страниц конечно легко визуализировать »
Для кастомных. Как это будет выглядеть ?
показывает сколько Windows работает с момента запуска »
Странно...
А если с выделением-очисткой памяти :

System::Alloc 400
pop $2
System::Call 'kernel32::GetTickCount()i .r0'
System::Free $2

K.A.V.
18-02-2013, 17:33
Странно... »
У меня команда была забита в onInit функции (забивал в предыдущий пример с отображением времени в заголовке) :)
Если в секции с паузой, то всё норм

profcom
18-02-2013, 20:02
Для кастомных. Как это будет выглядеть ? »
Ну как то так на мой взгляд, дальше по воображению можно поставить значение куда угодно. Это лишь пример как использовать.
!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

profcom
18-02-2013, 21:16
Вот еще набросал примерчик для стандартной функций установки используя плагин 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

profcom
18-02-2013, 21:57
Подскажите что я делаю не так. Есть код: »
Правильно вам делали замечания, пишите проще что бы самому не запутаться. И желательно изучите логические конструкции в русском справочнике, пригодиться еще не раз.
!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