1 (изменено: serzh82saratov, 2017-08-20 00:42:53)

Тема: AHK: Часы, таймер, секундомер

Добавил в коллекцию такие часики.

Есть пара вопросов, при срабатывании таймера пока "висит MsgBox" WM_MOUSEWHEEL сообщения работают, а WM_LBUTTONDOWN и.т.п. не работают.


#SingleInstance Force

Gui, +HWNDhMain -DPIScale
Gui, Show, w420 h640 
Timer := New ClockGui(hMain, "Timer|Sec|w 400|h 120|ds 1|db 8|bckgitem 212121|coloritem FFFFFF|Font s80")
Timer.Show(10, 10, "00:00:01")
Timer.Start("EndTimer")
Return

EndTimer(This) { 
	This.Block(0)
	MsgBox TestTimer - Время вышло
}

GuiClose:
	ExitApp

И правильно ли метод Delete удаляет экземпляр класса?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

2

Re: AHK: Часы, таймер, секундомер

serzh82saratov пишет:

И правильно ли метод Delete удаляет экземпляр класса?

У меня он вообще не срабатывает. Наверное, нужно было __Delete().

serzh82saratov пишет:

при срабатывании таймера пока "висит MsgBox" WM_MOUSEWHEEL сообщения работают, а WM_LBUTTONDOWN и.т.п. не работают.

Фиг знает, попробуй упростить пример, а так нужно в коде копаться.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: serzh82saratov, 2017-08-20 02:20:11)

Re: AHK: Часы, таймер, секундомер

teadrinker пишет:

Наверное, нужно было __Delete().

Имею ввиду Timer.Delete(). При закрытии скрипта удалять там вроде нечего.

teadrinker пишет:

попробуй упростить пример


Global hGuihWndWnd, hH1

Gui, +HWNDhMain -DPIScale
Gui, Show, w155 h155
New ClockGui(hMain) 
MsgBox
Return 

GuiClose:
	ExitApp

Class ClockGui {
	Static WM_LBUTTONDOWN := 0x201, WM_LBUTTONDBLCLK := 0x203, WM_RBUTTONDOWN := 0x204
		, WM_RBUTTONDBLCLK := 0x206, WM_MOUSEWHEEL := 0x020A
		
	__New(hwndparent) {
		Static H1
			OnMessage(this.WM_LBUTTONDOWN, this.OnButtonDown.Bind(1))
			, OnMessage(this.WM_LBUTTONDBLCLK, this.OnButtonDown.Bind(1))
			, OnMessage(this.WM_RBUTTONDOWN, this.OnButtonDown.Bind(1))
			, OnMessage(this.WM_RBUTTONDBLCLK, this.OnButtonDown.Bind(1))
			, OnMessage(this.WM_MOUSEWHEEL, this.OnMouseWheel.Bind(1)) 
		Gui, New
		Gui, +HWNDhGuihWndWnd -DPIScale -Caption +AlwaysOnTop +E0x08000000 +0x40000000 -0x80000000   
		Gui, Add, Text, x0 y0 w55 h55 +0x201 c000000 HwndhH1 Border +0x100 vH1, Text
		Gui, +Parent%hwndparent%
		Gui, Show, x10 y10
	}
	OnButtonDown(wp, lp, msg, hwnd) {   
		If (A_Gui = hGuihWndWnd && A_GuiControl = "H1")
			ToolTip OnButtonDown 
	}
	OnMouseWheel(wp, lp, msg, hwnd) {  
		MouseGetPos, , , , hControl, 2
		If (hH1 = hControl)
			ToolTip OnMouseWheel 
	}
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK: Часы, таймер, секундомер

When the script is displaying a system dialog such as MsgBox, any message posted to a control is not monitored. For example, if the script is displaying a MsgBox and the user clicks a button in a GUI window, the WM_LBUTTONDOWN message is sent directly to the button without calling the monitor function.

https://autohotkey.com/docs/commands/OnMessage.htm

5

Re: AHK: Часы, таймер, секундомер

Спасибо, не заметил.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6 (изменено: serzh82saratov, 2017-08-20 12:52:06)

Re: AHK: Часы, таймер, секундомер

Насчёт Delete, судя по выделенной памяти в диспетчере задач, на х32 экземпляр занимает 64кб, при удалении освобождается только 8кб.

#SingleInstance Force
#Persistent
#NoEnv
ListLines Off
SetBatchLines -1

Gui, +HWNDhMain -DPIScale
Gui, Color, F9D886
Gui, Show, w420 h640
MsgBox Экземпляр не создан
Timer := New ClockGui(hMain, "Timer|Sec|w 400|h 120|ds 1|db 16|bckgmain F9D886|bckgitem 212121|coloritem FFFFFF|Font s80|Colon")
Timer.Show(10, 10, "10:00:00")
Timer.Start("EndTimer")
MsgBox Экземпляр создан
Timer.Delete()
MsgBox Экземпляр удалён
ExitApp
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: AHK: Часы, таймер, секундомер

Способы удаления подсмотрел у teadrinker в классе ToolTip из коллекции, но оказалось что там тоже самое:

myTrayTip := new ToolTip({ text: "Модифицированный TrayTip"
                         , title: "AutoHotkey"
                         , CloseButton: true
                         , Icon: 1              ; 1 — Info, 2 — Warning, 3 — Error, n > 3 — предполагается hIcon
                         , TrayTip: true
                         , FontSize: 18
                         , FontName: "Verdana" })
myTrayTip.Destroy()
MsgBox % myTrayTip.text

Так понимаю MsgBox должен быть пуст?

Нашёл обсуждение, если к этому:

This.SetCapacity(0)
This.Base := "" 

сначала добавить This.Remove("", Chr(255)), то освобождает уже 16кб, вроде все ключи очищаются.
Но всё же освобождается не вся память.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8 (изменено: serzh82saratov, 2017-08-20 15:17:27)

Re: AHK: Часы, таймер, секундомер

serzh82saratov пишет:

вроде все ключи очищаются

Оказалось не все, если ключ является числом, то ещё надо:

This.Remove(1, This.Length())
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: Часы, таймер, секундомер

Бесит уже, если ключ не латиница и не число то не удаляет. Проще так:

		For, k, v in This.Clone()
			This.Remove(k)

Рекомендованный в справке Delete вместо Remove крашит процесс.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Часы, таймер, секундомер

stealzy пишет:

Из темы на оф.форуме, кажется Lexicos писал.

Это?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: Часы, таймер, секундомер

Скорее всего.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: Часы, таймер, секундомер

Повторюсь это плохо работает, см. 7 - 9 пост.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: Часы, таймер, секундомер

В методе Delete написано:

Any valid range of integer or string keys, where FirstKey <= LastKey. Both keys must be the same type.

Поэтому надо так:

obj := {"куненн": "впавпр", a: -126, 8: "bgkhjbjk"}
obj.Delete(Chr(0), Chr(0x10FFFF))
obj.Delete(-1000, 1000)
for key, val in obj
   MsgBox %key%=%val%

14 (изменено: serzh82saratov, 2017-08-21 22:56:50)

Re: AHK: Часы, таймер, секундомер

obj := {1001: -126}
obj.Delete(Chr(0), Chr(0x10FFFF))
obj.Delete(-1000, 1000)
for key, val in obj
   MsgBox %key% = %val%

Так всё равно не все удалит. Нас чёт числовых лучше так:

obj.Delete(obj.MinIndex(), obj.MaxIndex())

Про Delete вопрос состоит в его использовании внутри класса, применительно к своему экземпляру:

obj := New Class()
obj.Delete()

Class Class {
	__New() { 
	}
	Delete() {
		this.Delete(Chr(0), Chr(0x10FFFF))
	}
}

у меня вылетает с ошибкой.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15

Re: AHK: Часы, таймер, секундомер

Delete — служебное слово для объекта, поэтому вылетает.

obj := New Class()
MsgBox, % obj.test
obj.DeleteObj()
MsgBox, % obj.test

Class Class {
   __New() { 
      this.test := "test"
   }
   DeleteObj() {
      this.Delete(Chr(0), Chr(0x10FFFF))
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16 (изменено: serzh82saratov, 2017-08-21 23:09:07)

Re: AHK: Часы, таймер, секундомер

Точно.
http://www.hjelpekilden.no/uploads/1/3/1/6/13166795/763028166_orig.jpg

Значит можно считать одинаковыми?

This.Delete(Chr(0), Chr(0x10FFFF)) 
This.Delete(This.MinIndex(), This.MaxIndex())

и

For, k, v in This.Clone()
	This.Delete(k)

Или первое лучше, так как Clone временно потребует памяти?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17

Re: AHK: Часы, таймер, секундомер

Первое лучше уже потому, что Remove «Deprecated (not recommended for use)».

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

18

Re: AHK: Часы, таймер, секундомер

На счёт Remove опечатался я.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19

Re: AHK: Часы, таймер, секундомер

Если первый вариант работает, он наверно лучше, а то мало ли, сколько там клонировать придётся.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

20 (изменено: serzh82saratov, 2017-08-21 23:25:27)

Re: AHK: Часы, таймер, секундомер

Да, ключи вроде все чистит. Вообщем ничего кроме этого пока науке неизвестно?

This.Delete(Chr(0), Chr(0x10FFFF)) 
This.Delete(This.MinIndex(), This.MaxIndex())
This.SetCapacity(0)
This.Base := ""

Но только освобождается памяти в разы меньше, чем занимается при создании экземпляра (6 пост).

А чисто теоретически, почему ObjRelease(&this) не годится для этих целей?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

21

Re: AHK: Часы, таймер, секундомер

ObjRelease() сам по себе не освобождает память, а только уменьшает на единицу количество ссылок на него.

obj := New Class()
ptr := Object(obj)
MsgBox, % ObjRelease(ptr)

Class Class {
   __New() { 
      this.test := "test"
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

22

Re: AHK: Часы, таймер, секундомер

Можно так освободить (правда надо тестировать к чему это может привести):

dllcall("psapi.dll\EmptyWorkingSet", "ptr", -1)

23

Re: AHK: Часы, таймер, секундомер

Что именно освободить-то?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

24

Re: AHK: Часы, таймер, секундомер

Оперативную память потребляемую процессом.

25

Re: AHK: Часы, таймер, секундомер

Так у нас разве такая задача? Нам нужно только память объекта освободить.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

26

Re: AHK: Часы, таймер, секундомер

А для чего именно нужно память объекта освободить?

27

Re: AHK: Часы, таймер, секундомер

Ну, всю память освобождать не обязательно (если там не мегабайты), но для порядка нужно, чтобы не могло быть нежелательных срабатываний при ошибочном вызове его методов или свойств.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

28

Re: AHK: Часы, таймер, секундомер

Для порядка вроде же как освободили в 20 сообщении.
Но я так понял, что serzh82saratov хочет именно уменьшить потребляемую оперативную память.

29 (изменено: serzh82saratov, 2017-08-22 02:58:10)

Re: AHK: Часы, таймер, секундомер

Как понять уменьшить потребляемую? Скорее очистить непотребляемую. Например было занято 2000кб, создали экземпляр стало 2064кб, удалили экземпляр должно стать 2000кб, иначе получается утечка памяти по каждой операции создания \ удаления экземпляра.

Например понадобится создавать экземпляр который весит 10мб, через секунду он отработает, и удалившись очистит только 4кб, и так в цикле. С такими "хвостами" память переполнится быстро.

Loop
{
	obj%A_Index% := New Class()
	obj%A_Index%.DeleteObj()
}

Class Class {
   __New() {
   }
   DeleteObj() {
		This.Delete(Chr(0), Chr(0x10FFFF)) 
		This.Delete(This.MinIndex(), This.MaxIndex())
		This.SetCapacity(0)
		This.Base := ""
   }
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

30

Re: AHK: Часы, таймер, секундомер

А объекты тут не при чём.
Происходит такая же утечка, так как переменные фактически не стираются.

Loop
{
   obj%A_Index% := "a"
   obj%A_Index% := ""
}

31

Re: AHK: Часы, таймер, секундомер

Типа буфер ListVars забивается именами переменных, т.к. если давать длинные имена, то забивается кратно больше памяти.

#NoEnv
ListLines Off

Loop 100000
{
   longlonglonglonglonglonglonglonglonglong_name%A_Index% := "a"
   VarSetCapacity(longlonglonglonglonglonglonglonglonglong_name%A_Index%, 0) 
}
ListVars
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

32

Re: AHK: Часы, таймер, секундомер

При уничтожении объекта его память должна освобождаться автоматически, за это отвечает сам объект — в данном случае его реализация внутри AutoHotkey. Никакие дополнительные усилия не должны требоваться.

AutoHotkey может иметь свои соображения насчёт того, освобождать ли память сразу или нет. Кроме того, в любом процессе выполняется не только код приложения, но и код ОС. Может, этот остаток был выделен для чего-то системой, откуда нам знать.

33

Re: AHK: Часы, таймер, секундомер

Ну так я не модератор чтобы посты перенести в новую. Тут обсуждаем класс, в данном случае его возможную недоработку.
YMP вообщем вопрос снимаестя?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

34

Re: AHK: Часы, таймер, секундомер

serzh82saratov
Я бы не напрягался по этому поводу. Разве что реально большие объёмы бы накапливались.