Что нового

Одновременное выполнение нескольких функций?

JaG

Новичок
Сообщения
17
Репутация
0
Есть скрипт, в нем несколько функций, функции друг от друга не зависят не как.
Но при запуске двух бесконечных циклов эти функции воспроизводятся по очереди.
Тоесть сначала первая выполняет свои действия, затем прекращает, затем вторая выполняет свои, и так по кругу.
Самое не приятное то что при зависании одной, вторая уже не воспроизведется.

Возможно ли запустить обе функции одновременно? Чтобы они не зависили друг от друга?

Может я не так выразился?
У меня есть две функции запускаемые при нажатии на кнопку, для каждой функции своя кнопка.

Запускаются они НЕ одновременно, но когда работает одна и запускаем вторую то она какбы встает в очередь и выполняется после первой.
Мне нужно сделать чтобы эти две функции не зависили друг от друга, тоесть я запустил одну, патом запустил вторую, и они выполняются бесконечно и одновременно друг с другом, а не по очереди.
Реализуемо ли это?
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Re: Одновременное выполнение нескольких циклов?

сделай 2 скрипта и запускай их одновременно
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Re: Одновременное выполнение нескольких циклов?

JaG [?]
Тоесть сначала первая выполняет свои действия, затем прекращает, затем вторая выполняет свои, и так по кругу.
Почему обязательно 2 цикла?

AdLibRegister в справке.
 
Автор
J

JaG

Новичок
Сообщения
17
Репутация
0
Re: Одновременное выполнение нескольких циклов?

Может я не так выразился?
У меня есть две функции запускаемые при нажатии на кнопку, для каждой функции своя кнопка.

Запускаются они НЕ одновременно, но когда работает одна и запускаем вторую то она какбы встает в очередь и выполняется после первой.
Мне нужно сделать чтобы эти две функции не зависили друг от друга, тоесть я запустил одну, патом запустил вторую, и они выполняются бесконечно и одновременно друг с другом, а не по очереди.
Реализуемо ли это?


Добавлено:
Сообщение автоматически объединено:

axlwor сказал(а):
сделай 2 скрипта и запускай их одновременно
Можно ли два скрипта запустить в одном окне?
 

astanid

Новичок
Сообщения
38
Репутация
0
буду археологом... за 4 года ничего не изменилось ?
нужно две функции:
одна пишет координаты некого обьекта в игре (раз в N секунд) в двумерный массив.
вторая по этим координатам проводит игрока (от точки к точке сколько угодно он может идти)

Как это сделать ? запускать внешний файл .au3 ? получится ли данными тогда обменяться ?

http://www.autoitscript.com/forum/topic/137297-two-functions-run-simultaneously/
 

firex

AutoIT Гуру
Сообщения
943
Репутация
205
astanid
Для решения этой задачи потоки не нужны, внимательно подумайте еще раз.

Однако это не ответ на ваш вопрос, так что я все же попробую объяснить почему не стоит даже пытаться это сделать:
Код:
#include <WinAPIEx.au3>

Local $cbVolFunction = DllCallbackRegister("_VolFunc", "int", "ptr")
	Global $hVolFunc_Thread = _WinAPI_CreateThread( DllCallbackGetPtr( $cbVolFunction ) )

While Sleep( 10 )
	ConsoleWrite( Random( 100, 999, 1 ) & @CRLF)
WEnd

Volatile Func _VolFunc( $pVar )
	MsgBox( 64, '', 1 )
EndFunc


;//WinAPI
Func _WinAPI_CreateThread( $iAddress, $pArg = 0 )
	Local $aRet = DllCall( 'kernel32.dll', 'ptr', 'CreateThread', 'ptr', 0, 'dword_ptr', 0, 'ptr', $iAddress, 'ptr', $pArg, 'dword', 0, 'dword*', 0)
	If @Error Then _
		Return False

	Return 1
EndFunc

Предположим у нас получилось сделать некое "подобие" потоковому выполнению, однако при попытке самовыпилиться - поток положит с собой выполнение всего скрипта.

Максимум чего вы сможете добиться - так это более-менее корректного завершения работы скрипта этим потоком, примерно так:
Код:
#Include <WinAPIEx.au3>

Local $cbVolFunction = DllCallbackRegister("_VolFunc", "int", "ptr")
	Global $fVolFunc_Exit, $hVolFunc_Thread = _WinAPI_CreateThread( DllCallbackGetPtr( $cbVolFunction ) )

While Sleep( 10 )
	ConsoleWrite( Random( 100, 999, 1 ) & @CRLF)
	If $fVolFunc_Exit Then
		_WinAPI_TerminateThread( $hVolFunc_Thread, 0 )
		$fVolFunc_Exit = False
	EndIf
WEnd

Volatile Func _VolFunc( $pVar )
	MsgBox( 64, '', 1 )
	_AutThread_Exit( $fVolFunc_Exit )
EndFunc


Func _WinAPI_CreateThread( $iAddress, $pArg = 0 )
	Local $aRet = DllCall( 'kernel32.dll', 'ptr', 'CreateThread', 'ptr', 0, 'dword_ptr', 0, 'ptr', $iAddress, 'ptr', $pArg, 'dword', 0, 'dword*', 0)
	If @Error Then _
		Return False

	Return 1
EndFunc

Func _WinAPI_TerminateThread( $hThread, $iCode = 1 )
	Local $aRet = DllCall( 'kernel32.dll', 'bool', 'CreateThread', 'ptr', $hThread, 'dword', $iCode )
	If @Error Then _
		Return False

	Return $aRet[0]
EndFunc

Func _AutThread_Exit(ByRef $fExit)
	$fExit = True
	While Sleep( 10 )
		WEnd
EndFunc

Обращаться к переменной одновременно вы не сможете, выход - передавать в качестве аргумента в функцию указатель на структуру.

Вывод: даже не забивайте себе этим голову.
Ну а мне стоило бы оторвать себе руки за подобные эксперименты, ибо все это - полнейший бред.
 

astanid

Новичок
Сообщения
38
Репутация
0
рабочее решение я все же нашел
координаты считывать через AdlibRegister раз в 1 с в глобальный массив
а основная функция постоянно читает этот самый массив
 

firex

AutoIT Гуру
Сообщения
943
Репутация
205
astanid [?]
рабочее решение я все же нашелкоординаты считывать через AdlibRegister раз в 1 с в глобальный массива основная функция постоянно читает этот самый массив
Вы учтите, что AdlibRegister может вызвать функцию в любом моменте при выполнении вашего основного кода @ возможны ошибки. Тем более - во время выполнения этой функции основное выполнение приостанавливается.
 

astanid

Новичок
Сообщения
38
Репутация
0
firex сказал(а):
astanid [?]
рабочее решение я все же нашелкоординаты считывать через AdlibRegister раз в 1 с в глобальный массива основная функция постоянно читает этот самый массив
Вы учтите, что AdlibRegister может вызвать функцию в любом моменте при выполнении вашего основного кода @ возможны ошибки. Тем более - во время выполнения этой функции основное выполнение приостанавливается.
функция у меня без пауз, так что вроде работает. а есть другие идеи ? задачу я описал примеру. нужно одновременно писать данные в некий массив и их читать
 
Верх