воскресенье, 28 ноября 2010 г.

Подобие многопоточности в AutoIt

AutoIt хорош всем, кроме двух вещей (для меня лично): медленность работы и отсутствие многопоточности. С первой проблемой борются оптимизацией кода (полезно все-таки), со второй каждый своими велосипедами. О своем велосипеде мне и хотелось бы рассказать.
В начале был код. Хитрить не буду - код отрубания около 50 машин по сети, с использование программы из пакета pstools (вещь очень удобная и полезная). Вот для этой программы и была написана на AutoIt графическая оболочка, дабы облегчить её использование. В самой оболочке в цикле вызывалась программа psshutdown.exe с именем отключаемой машины в качестве параметра. Все бы хорошо, но следующая машина не выключалась, пока не проработает программа для предыдущей. И вот эти 50 машин выключались добрых полчаса, а то и больше. Вывод был очевиден - нужна было многопоточность. Но в AutoIt`е её нету. Вывод - пишем велосипед, её имитирующий.
Суть:
Весь пакет состоит из двух exe: первый выполняет работу, в зависимости от переданных ему параметров. Второй взвывает первый с нужными параметрами.

Простой пример: вычислить сумму от 1 до (1000000 + I), где I меняется от 1 до 10.

Runer.au3

;Прога, в которой создается "поток"
For $I = 1 To 10
ShellExecute("get.exe", $I)
Next
MsgBox(0, "Finish", "All call completed.")

Get.au3
;Тело "потока"
#NoTrayIcon
$RESULT = 1
For $I = 2 To $CmdLine[1]
$RESULT = $I + $RESULT
Next
MsgBox(0, $CmdLine[1], $RESULT)

Строем .exe для Get.au3 и запускаем Runer.au3