1 (изменено: MoZg, 2016-03-07 18:52:30)

Тема: AHK: Запись текста в массив и удаление через 5 минут

Доброго времени суток, мне нужна реализация записи текста в массив и удаление через 5 мин после записи. Т.е. Мы записываем текст в массив и через 5 мин после записи удаляем его. Заранее спасибо.

2

Re: AHK: Запись текста в массив и удаление через 5 минут

Непонятно, в чём сложность.

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

3 (изменено: serzh82saratov, 2016-03-08 05:05:34)

Re: AHK: Запись текста в массив и удаление через 5 минут

Если каждый ключ удалять в своё время, то как то так:


#Persistent

Time := 5 * 60 * 1000   ;  5 минут
oArr := []
SetTimer, Remove, -%Time% 
oArr[A_TickCount] := "Text 1"  ; пример записи в такой массив 
Return

Remove:  
 	If (A_TickCount - oArr.MinIndex() >= Time)
		oArr.RemoveAt(oArr.MinIndex())
	SetTimer, Remove, % "-" (!oArr.MinIndex() ? Time : Time - (A_TickCount - oArr.MinIndex())) 
	Return
+ Демо:

#Persistent

Start := A_TickCount
SetTimer, Demo, 100


Time := 10000   ;  10 секунд
oArr := []
SetTimer, Remove, -%Time% 
 
								;  удаление через:
oArr[A_TickCount] := "Text 1"   ;  через 10 секунд
Sleep 2000 
oArr[A_TickCount] := "Text 2"   ;  через 12 секунд
Sleep 3000						 
oArr[A_TickCount] := "Text 3"   ;  через 15 секунд
Sleep 3000						 
oArr[A_TickCount] := "Text 4"   ;  через 18 секунд
Return

Remove:  
 	If (A_TickCount - oArr.MinIndex() >= Time)
		oArr.RemoveAt(oArr.MinIndex())
	SetTimer, Remove, % "-" (!oArr.MinIndex() ? Time : Time - (A_TickCount - oArr.MinIndex())) 
	Return
	
Demo:
	For k, v in oArr, content := ""
		content .= "Добавлено " (A_TickCount - k) // 1000 " секунд назад:`t`t" v "`n" 
	ToolTip % "Прошло секунд: " (A_TickCount - Start) // 1000 "`nСодержимое массива:`n`n" content
	Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK: Запись текста в массив и удаление через 5 минут

Спасибо большое, задача решена.

5

Re: AHK: Запись текста в массив и удаление через 5 минут

Столкнулся с такой проблемой... Бывает что эта строка:

(!oArr.MinIndex() ? Time : Time - (A_TickCount - oArr.MinIndex())) 

возвращает отрицательное значение и т.к. перед этим выражением стоит "-", то получается, например, --1547862 и AutoHotkey выдает ошибку. Скриншот. Подскажите как решить эту проблему.

6 (изменено: serzh82saratov, 2016-05-04 04:14:26)

Re: AHK: Запись текста в массив и удаление через 5 минут

http://forum.script-coding.com/viewtopi … 26#p103326.

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

7

Re: AHK: Запись текста в массив и удаление через 5 минут

Тут как-то не очень логично — последнее значение удалено, а таймер продолжает работать.
Я бы так сделал:

#Persistent
MyArray := new DeleteKey(5000)  ; удалять через 5 секунд
MyArray.MyKey := 1   ; если нужно своё название ключа, кроме зарезервированного "_time"
MyArray.Push(10)		; если название ключа не имеет значения
Return

class DeleteKey
{
	__New(time)  {
		this._time := time
	}
	__Set(key)  {
		if (key != "_time")  {
			Timer := Func("Timer").Bind(this, key)
			SetTimer, % Timer, % "-" this._time
		}
	}
	Push(value)  {
		var := this.MaxIndex()
		this[(var = "" ? 0 : var) + 1] := value
	}
}

Timer(obj, key)  {
	obj.Delete(key)
}
+ демо
#Persistent
SetTimer, Timer

MyArray := new DeleteKey(5000)  ; удалять через 5 секунд
MyArray.MyKey := 1   ; если нужно своё название ключа
Sleep, 1000
MyArray.Push(2)		; если название ключа не имеет значения
Sleep, 1000
MyArray.test := 3
Sleep, 1000
MyArray.Push(4)
Return

class DeleteKey
{
	__New(time)  {
		this._time := time
	}
	__Set(key)  {
		if (key != "_time")  {
			Timer := Func("Delete").Bind(this, key)
			SetTimer, % Timer, % "-" this._time
		}
	}
	Push(value)  {
		var := this.MaxIndex()
		this[(var = "" ? 0 : var) + 1] := value
	}
}

Delete(obj, key)  {
	obj.Delete(key)
}

Timer:
	CoordMode, ToolTip
	text := ""
	for k, v in MyArray
		if (k != "_time")
			text .= "MyArray." k " = " v "`n"
	ToolTip % text, A_ScreenWidth//2, A_ScreenHeight//2, 1
	Return

И ключи, если нужно, можно называть, если не нужно — можно не называть.

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

8

Re: AHK: Запись текста в массив и удаление через 5 минут

teadrinker пишет:

Тут как-то не очень логично — последнее значение удалено, а таймер продолжает работать.

Почему, в данном случае так и должно быть. Я сначала тоже думал для каждого ключа выделять отдельный таймер, но потом решил что для конкретной задачи это избыточно, да и мало ли сколько там ключей наберётся, таймер это же тоже ресурс, ничего плохого если он раз в 5 минут будет запускать проверку вхолостую.

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

9

Re: AHK: Запись текста в массив и удаление через 5 минут

Мой корректно работает при достаточно большом количестве ключей:

#Persistent
SetTimer, Timer

MyArray := new DeleteKey(5000)  ; удалять через 5 секунд
Loop 1000  {
	Sleep, 10
	MyArray.Push(A_Index)
}

class DeleteKey
{
	__New(time)  {
		this._time := time
	}
	__Set(key)  {
		if (key != "_time")  {
			Timer := Func("Delete").Bind(this, key)
			SetTimer, % Timer, % "-" this._time
		}
	}
	Push(value)  {
		var := this.MaxIndex()
		this[(var = "" ? 0 : var) + 1] := value
	}
}

Delete(obj, key)  {
	obj.Delete(key)
}

Timer:
	CoordMode, ToolTip
	text := ""
	for k, v in MyArray
		if (k != "_time")
			text .= "MyArray." k " = " v "`n"
	ToolTip % text, A_ScreenWidth//2, A_ScreenHeight//2, 1
	Return

А вот твой выдаёт вышеуказанную ошибку, почему — не знаю, не разбирался:

#Persistent

Time := 5000   ;  5 минут
oArr := []
SetTimer, Remove, -%Time% 
oArr[A_TickCount] := 0
Sleep, 2000
oArr[A_TickCount] := 1

Loop 1000  {
	Sleep, 10
	oArr[A_TickCount] := A_Index
}
Return

Remove:
 	If (A_TickCount - oArr.MinIndex() >= Time)
		oArr.RemoveAt(oArr.MinIndex())
	SetTimer, Remove, % "-" (!oArr.MinIndex() ? Time : Time - (A_TickCount - oArr.MinIndex())) 
	ToolTip % oArr[oArr.MinIndex()]
	Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10 (изменено: serzh82saratov, 2016-05-04 04:17:27)

Re: AHK: Запись текста в массив и удаление через 5 минут

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


#Persistent

Time := 5000   
oArr := []
SetTimer, Remove, -%Time% 
oArr[A_TickCount] := 0
Sleep, 2000
oArr[A_TickCount] := 1

Loop 1000  {
	Sleep, 10
	oArr[A_TickCount] := A_Index
}
Return

Remove:
 	If (A_TickCount - oArr.MinIndex() >= Time)
		oArr.RemoveAt(oArr.MinIndex())
	SetTimer, Remove, % "-" (!oArr.MinIndex() ? Time : (N := Time - (A_TickCount - oArr.MinIndex())) < 1 ? 1 : N)  
	ToolTip % oArr[oArr.MinIndex()]
	Return
MoZg пишет:

Столкнулся с такой проблемой...

Должно работать:


#Persistent

Time := 5 * 60 * 1000   ;  5 минут
oArr := []
SetTimer, Remove, -%Time% 
oArr[A_TickCount] := "Text 1"  ; пример записи в такой массив 
Return

Remove:  
 	If (A_TickCount - oArr.MinIndex() >= Time)
		oArr.RemoveAt(oArr.MinIndex())
	SetTimer, Remove, % "-" (!oArr.MinIndex() ? Time : (N := Time - (A_TickCount - oArr.MinIndex())) < 1 ? 1 : N) 
	Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: Запись текста в массив и удаление через 5 минут

serzh82saratov пишет:

Должно работать:

Нет:


#Persistent

SetTimer, Timer

Time := 1000
oArr := []

Loop 500  {
	Sleep, 10
	oArr[A_TickCount] := A_Index
} 
SetTimer, Remove, -%Time%  
Return

Remove:
 	If (A_TickCount - oArr.MinIndex() >= Time)
	{
		oArr.RemoveAt(oArr.MinIndex()), ++i
		ToolTip % i " удалено из массива"
	}
	SetTimer, Remove, % "-" (!oArr.MinIndex() ? Time : (N := Time - (A_TickCount - oArr.MinIndex())) < 1 ? 1 : N)  
	Return
	
Timer:
	For k, v in oArr, content := ""
		content .= "Добавлено " (A_TickCount - k) // 1000 " секунд назад:`t`t" v "`n" 
	ToolTip % "Прошло секунд: " (A_TickCount - Start) // 1000 "`nСодержимое массива:`n`n" content
	Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: Запись текста в массив и удаление через 5 минут

А что не так? Ты дожидался окончания записи в массив? Переполненный ToolTip очень много отнимает времени на отображение.


CoordMode, ToolTip 
	
#Persistent

Time := 3000
oArr := []

Loop 500  {
	Sleep, 10
	oArr[A_TickCount] := A_Index
} 
MsgBox Запись окончена
SetTimer, Timer, 1000
SetTimer, Remove, -%Time%  
Return

Remove:
 	If (A_TickCount - oArr.MinIndex() >= Time)
	{
		oArr.RemoveAt(oArr.MinIndex()), ++i
		ToolTip % i " удалено из массива",1,1,3
	}
	SetTimer, Remove, % "-" (!oArr.MinIndex() ? Time : (N := Time - (A_TickCount - oArr.MinIndex())) < 1 ? 1 : N)  
	Return
	
Timer:
	For k, v in oArr, content := ""
		content .= "Добавлено " (A_TickCount - k) // 1000 " секунд назад:`t`t" v "`n" 
	ToolTip % "Прошло секунд: " (A_TickCount - Start) // 1000 "`nСодержимое массива:`n`n" content
	Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: Запись текста в массив и удаление через 5 минут

Так да, вроде работает.

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

14

Re: AHK: Запись текста в массив и удаление через 5 минут

Думаю что и по другому тоже, только надо дожить до момента выполнения кода из 11 поста.

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

15

Re: AHK: Запись текста в массив и удаление через 5 минут

Спасибо большое.