Что нового

Процессы выполнение простой задачи в отдельном потоке от основного цикла while

RockMan

Новичок
Сообщения
67
Репутация
0
есть основное тело цикла
while 1
;основной цикл
wend
есть отдельно написанная функция которую я пока вызываю через AdlibRegister, но когда я ее вызываю, и пока она выполняется то основной while притормаживает свою работу, как этого избежать? как в отдельном поток запустить написанную функцию?
 
Автор
R

RockMan

Новичок
Сообщения
67
Репутация
0
а какие то кастомные UDF ? типо _ThreadCreate
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Повторяю, интерпретатор AutoIt не поддерживает многопоточность.
Запускайте несколько скриптов и обменивайтесь данными между ними. На AutoIt по другому не получится.

Код:
$handle = DllCallbackRegister("ThreadFunc", "none", "ptr")
_WinAPI_CreateThread(DllCallbackGetPtr($handle), 0)

$Counter = 0

while 1
    ConsoleWrite("Main " & $Counter & @CRLF)
    $Counter+=1
    Sleep(10)
wend

Func ThreadFunc($Param)
    Local $Counter = 0
    while 1
        ConsoleWrite("Thread " & $Counter & @CRLF)
        $Counter+=1
        Sleep(10)
    wend
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 0
    Return $aRet[0]
EndFunc
Только код нормально работать не будет. Вылетает через небольшой промежуток времени.
Это много раз обсуждалось.
Один из ответов в теме
Проблема в том, что менеджер памяти (?) в AutoIt изначально не писался для мультипотоковых приложений. Поэтому любая попытка запустить дополнительный поток в рамках DllCallRegister() чревата непредсказуемыми последствиями (в большинстве случаев крахом процесса). Другими словами, функция потока не может использовать внутренние функции AutoIt. Единственный способ запустить дополнительный поток, это написание .dll на другом ЯП, поддерживающим мультипоточность, например Pure Basic. Как вариант, можно написать функцию потока непосредственно в машинном коде aka ассемблер. тем самым обойтись без .dll. Простой пример см. здесь. На этом, думаю, вопрос исчерпан.

Если нужна многопоточность, напишите код на языке поддерживающим ее.
 
Последнее редактирование:

Oki

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

Чем такие параллельные запуски с обменом данными будут проигрывать нативной многопоточности, кроме самых очевидных неудобств организации?

Параллельно бегущие скрипты выполняются всё ещё в общем интерпретаторе? Или копии интерпретаторов всё-таки создаются и даже могут эффективно использовать многоядерность и/или многопоточность процессора?
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Если при этом запуски производить скриптом AutoIt,то будут ли они в этом смысле несколькими скриптами?
Будет это один и тот же или разные скрипты не важно. Они выполняются в разных процессах и в отличии от многопоточности, изолированы друг от друга и нет доступа в переменным, массивам, объектам и др. скриптов.
Короче правила те же что при работе с другими процессами.

Чем такие параллельные запуски с обменом данными будут проигрывать нативной многопоточности
Допустим в скрипте есть глобальные переменные и массивы содержащие разные данные. При многопоточности они доступны т. к. процесс тот же. Если скрипты выполняются в разных процессах, они недоступны и нужно писать дополнительный код для передачи данных между процессами.
Короче, это не замена многопоточности, т. к. сильно усложняет работу с общими данными.

Параллельно бегущие скрипты выполняются всё ещё в общем интерпретаторе?
В каждом процессе свой экземпляр интерпретатора. А многопоточность (несколько экземпляров интерпретатора в процессе) AutoIt не поддерживает.
 
  • Like
Реакции: Oki

Oki

Продвинутый
Сообщения
452
Репутация
62

Prog

Благодарю за прояснения. Таким образом, можно резюмировать, что налаживание общения между скриптами может решить многие задачи, которые обычно решают многопоточностью, но само это налаживание неудобно?
В каждом процессе свой экземпляр интерпретатора. А многопоточность (несколько экземпляров интерпретатора в процессе) AutoIt не поддерживает.
У меня всё же ранее создалось впечатление, что всё равно в этом существует какой-то отрицательный нюанс, поскольку запущенные одновременно несколько вычислительных скриптов выполняются непропорционально дольше (если замерять коэффициент замедления или ускорения) в сравнении с вычислительными программами на других языках программирования, одновременно запускаемыми в тех же условиях: такая же длительность работы одиночного пробега и такое же количество одновременных процессов.
 

Prog

Продвинутый
Сообщения
537
Репутация
65
налаживание общения между скриптами может решить многие задачи, которые обычно решают многопоточностью, но само это налаживание неудобно?
Процессы изолированы и если запустите несколько процессов одного и того же скрипта, у каждого будут свои переменные.
Обычно в многопототочном приложении код потоков активно взаимодействует между собой используя общие переменные и ресурсы в целом. У процессов общих переменных нет. У каждого свои экземпляры.
 

Oki

Продвинутый
Сообщения
452
Репутация
62
Обычно в многопототочном приложении код потоков активно взаимодействует между собой используя общие переменные и ресурсы в целом.
Степень этой активности взаимодействия не всегда требуется очень высокая. При высокой, конечно, будут значительными потери производительности на общение между различными процессами, это ясно.
 

Prog

Продвинутый
Сообщения
537
Репутация
65
При высокой, конечно, будут значительными потери производительности
Запуск нескольких процессов скрипта для увеличения производительности сомнительно. Один поток на компилируемом ЯП может работать быстрее на несколько порядков в сравнении с скриптом AutoIt и для ускорения вычислений имеет смысл написать часть кода на другом ЯП, скомпилировать dll и подключить к скрипту. Пусть AutoIt занимается автоматизацией, а задачи требующие высокой производительности (поиск на картинке и подобное) выполняет dll в том числе в несколько потоков.
 

Oki

Продвинутый
Сообщения
452
Репутация
62
Один поток на компилируемом ЯП может работать быстрее на несколько порядков в сравнении с скриптом AutoIt и для ускорения вычислений имеет смысл написать часть кода на другом ЯП, скомпилировать dll и подключить к скрипту.
Это само собой. Но странным образом нарушается и пропорция (не в пользу скриптов) при одновременном запуске нескольких одинаковых процессов (например, вычислительных вероятностных алгоритмов). Даже с учётом того, что скрипт выполняется дольше изначально: поправка на это делается либо делением на соотношение скоростей при единичном запуске, либо уменьшением нагрузки на скрипт для приведения в равные условия (например, уменьшая количество циклов повторения в скрипте относительно таковых в скомпилированном коде). Мне как-то довелось столкнуться с этим эффектом, когда тест на сравнение скоростей различных процессоров получилось удобнее выполнить именно на AutoIt, а не на компилируемых языках, как это делалось ранее в моём предшествующем опыте, но сравнительная картина оказалась иначе зависящей от количества параллельно запущенных процессов. Если под каждый запуск скрипта создаётся собственная копия интепретатора, то такой эффект неожидаем. Видимо, существуют какие-то нюансы, ухудшаюшие картину.
 

RaZum

Знающий
Сообщения
78
Репутация
14
А что с запуском экземпляров скрипта на разных ядрах?
 

Sergio

Новичок
Сообщения
41
Репутация
3
есть основное тело цикла
while 1
;основной цикл
wend
есть отдельно написанная функция которую я пока вызываю через AdlibRegister, но когда я ее вызываю, и пока она выполняется то основной while притормаживает свою работу, как этого избежать? как в отдельном поток запустить написанную функцию?
можно более подробно узнать хотелку? Есть подозрение, что это можно сделать в один поток
 
Верх