1

Тема: AHK: странности в работе OnMessage() - как лечить?

Ранее я уже создавал тему про передачу информации из одного скрипта в другой. В принципе все получилось и работает, но сама функция OnMessage работает странно, мне даже не удалось найти никакого объяснения на форумах.

В третьем параметре MaxThreads я установил 100, чтобы не терять сообщения. Далее функция OnMessage вызывает функцию по назначению и она начинает свою работу. Однако если в исполняемой функции сделать задержку, начинается самое интересное.

Если, например, задержка стоит в 30 секунд, и во время выполнения этой задержки OnMessage получит еще одно такое же сообщение, то задержка начнется с начала. То есть если прошло уже 10 секунд, после второго сообщения пройдет еще 30, после этого исполняемая функция завершится мгновенно два раза подряд.

Если каждые 10 секунд (вплоть до 29) отправлять новое сообщение, скрипт будет ждать бесконечно. Как только последнее сообщение подождет свои 30 секунд, скрипт отправит сразу все ответы, которые он должен был отправить до этого.

-

Я разделял потоки, как раз чтобы выполнять такие задержки. Однако такая проблема ломает всю суть, а в теории бот даже можно сломать, спровоцировав вечную задержку. Так как работает эта функция и как можно вылечить это?

Привожу код скрипта получения и обработки сообщений:

OnMessage(0x4a, "tgupdates", 100)

tgupdates(wParam, lParam)
{
	StringAddress := NumGet(lParam + 2*A_PtrSize)  
    CopyOfData := StrGet(StringAddress) 
	tg := ObjFromStr(CopyOfData)

	text 			:= tg.message.text
	from_id 		:= tg.message.from.id

    if ( text != "" )
	{
		if ( text = "Hello" )
		{
			sleep, 5000
			SendMessage("You too", from_id, 0)
		}

		else if ( text = "Bye" )
		{
			sleep, 10000
			SendMessage("See you", from_id, 0)
		}
	}
}

2

Re: AHK: странности в работе OnMessage() - как лечить?

Я вам приводил ссылку в теме про бота, добавляйте в массив инфо, если нужна задержка ответа, указывайте её в инфо, в обработчике массива запускайте таймер ответа.
Обработчики частых событий (также как и по ссылке) должны завершатся максимально быстро.
А суть проблемы проста, многопоточности нет, есть только новые потоки которые прерывают предыдущие выполняемые, например 2 раза запустили вашу функцию, соответственно 2 вызов замораживает (прерывает) первый,  то есть первый начнёт ждать 5 секунд, только после того как 5 секунд подождёт второй.

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

3 (изменено: serzh82saratov, 2020-11-26 03:27:50)

Re: AHK: странности в работе OnMessage() - как лечить?

serzh82saratov пишет:

то есть первый начнёт ждать 5 секунд, только после того как 5 секунд подождёт второй.

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


SetTimer(Func("myFunc").Bind(1000, 1), -100)
SetTimer(Func("myFunc").Bind(3000, 2), -100)
SetTimer(Func("myFunc").Bind(5000, 3), -100)
Return

myFunc(s, p) {
	Sleep %s%
	MsgBox %p%
}

SetTimer(func, time) {
	SetTimer, % func, % time
}

Это ответ на:

Lencore228 пишет:

Если каждые 10 секунд (вплоть до 29) отправлять новое сообщение, скрипт будет ждать бесконечно. Как только последнее сообщение подождет свои 30 секунд, скрипт отправит сразу все ответы, которые он должен был отправить до этого.

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

4

Re: AHK: странности в работе OnMessage() - как лечить?

serzh82saratov

А можно ли попросить вас добавить комментарии к коду? Я вижу, могу скопировать и это может работать в моем коде, однако я не до конца понимаю суть кода и не могу его редактировать. Все-таки хотелось бы понимать, а не просто копировать и вставлять

По ссылке в другом топике я тоже переходил, но там я вообще ни шиша не понял. Потом попробовал просто MaxThreads повысить, вроде все решилось, но не без последствий.

5

Re: AHK: странности в работе OnMessage() - как лечить?

А что там комментировать, таймер вызывает функцию 3 раза почти одномоментно, аналог поведения OnMessage. А то что вы сходили по ссылке, ничего не поняли, и в итоге вставили Sleep в обработчик событий... Идите поступательно, надо было ещё в той теме задать вопрос, а как, а что, а не создавать новую тему, и задавать вопрос в духе - объясните мне сразу всё. Всё состоит из простых сущностей, разбивайте вопрос на более мелкие, иначе вы суть не схватите.

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