Что нового

Многопоточность в AutoIT'e

bulldog5293

Знающий
Сообщения
172
Репутация
9
В AutoIT'e запрещенно создавать многопоточность, под моим пониманием это одновременная работа нескольких дочерних программ из под родительского+передача данных туда-обратно, но разве нет никакова приёма что бы это обойти?
 

AZJIO

Меценат
Меценат
Сообщения
2,757
Репутация
1,151
Кем запрещено? модератором?

bulldog5293 [?]
но разве нет никакова приёма что бы это обойти?
Была бы задача, может там и обходить бы не пришлось. Процессор то можно задействовать на полную катушку, а паралельный поток можно представить как последовательное выполнение двух задач по очереди.
Я ещё не дошёл до планки, чтоб почуствовать проблему многопоточности. и далеко её не вижу.
 
Автор
B

bulldog5293

Знающий
Сообщения
172
Репутация
9
Кем запрещено? модератором?
Нет просто пишу программу которая должна работать с несколькими сайтами, суть в том что одна программа это родитель, а остальные (их много) дочернии программы, я решил так разделить, что бы по многу раз одно и тоже не переписывать. И хочу узнать, что бы последовательно не запускать их так как может быть ситлуация что должны работать они все, как можно запустить всё сразу?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,601
Репутация
941
запусти несколько ехешничков и свяжи их между собой :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
bulldog5293 [?]
В AutoIT'e запрещенно создавать многопоточность
Не запрещено, а просто не поддерживается.

под моим пониманием это одновременная работа нескольких дочерних программ из под родительского+передача данных туда-обратно
http://ru.wikipedia.org/wiki/Многопоточность

разве нет никакова приёма что бы это обойти?
Только запуск дочерних процессов, а обмен данными делается разными способами интеракции процессов, один из таких способов.
 
Автор
B

bulldog5293

Знающий
Сообщения
172
Репутация
9
CreatoR
Только запуск дочерних процессов, а обмен данными делается разными способами интеракции процессов
Обмен данными я как раз сейчас разбераю по примерам которые нашёл на ru-board, ну и посматрю что ты кинул
Не запрещено, а просто не поддерживается.
А никак нельзя зделать чтоб потдерживалась?
 
Автор
B

bulldog5293

Знающий
Сообщения
172
Репутация
9
AZJIO
И для этого нужно создать дочерние окна? А чем GUICtrlCreateListViewItem/GUICtrlCreateTabItem не дочерний процесс/окно по отношению к Gui? А чем ручной запуск дочерних окон производительней автоматического опроса элементов в цикле?
Хотел тем самым программу от попыток взлома защитить
Япро это уже читал, я думал раз на FileOpen чтение и запись используя масив и циклы чтение и запись производить одновременно можно, то и ту так можно обойти, жаль :( , в таком случае я закрываю тему
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,601
Репутация
941
То что она решена не забудь отметить ;)
 

lorents

Новичок
Сообщения
82
Репутация
1
Прочитал тему, но не совсем понял, можно ли допустим запустить 4 консольные программы подряд, и ждать их завершения?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
lorents
можно.
Код:
Local $pid[4], $progpath[4], $prognames[4]
For $i = 0 to 3
    $pid[$i] = Run($progpath[$i])
Next

For $i = 0 to 3
    ProcessWait($prognames[$i])
Next

; дальнейшие действия после завершение запущенных приложений.
 

lorents

Новичок
Сообщения
82
Репутация
1
Kaster
Спасибо, я как понимаю, можно даже целые алгоритмы (цепочку нескольких приложений) так запускать.
А как быть в с выводом информации? допустим файл, после прохождения алгоритма, должен выдать сообщение, а у меня таких потоков 4, как избежать того, чтобы они не одновременно выдали информацию, а последовательно. Т.к. может возникнуть такая ситуация, что два файла пришли к финишу одновременно.

и еще такой вопрос, можно будет при запуске алгоритма, отслеживать загрузку CPU и уже от нагрузки выбирать запускать поток или подождать (при этом появляется вопрос, а как долго ждать, и как узнать когда запускать)?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
lorents [?]
А как быть в с выводом информации?
Простой пример.
Файл test.au3 (должен лежать рядом со следующим файлом):
Код:
#NoTrayIcon
If Not $CmdLine[0] Then
	ConsoleWrite('No $CmdLine' & @LF)
	Exit
EndIf
$iNum = $CmdLine[1]
For $i = 2 To 12
	$iNum += Random(100, 1000)
	Sleep(Random(50, 100, 1))
Next
ConsoleWrite($CmdLine[1] & ' --> ' & $iNum)
Его запускаем 5 раз одновременно этим кодом:
Код:
#include <Array.au3>
#include <Constants.au3>

Dim $aWork[6][3] = [[5, 5]]

$sFile = @ScriptDir & '\test.au3'
For $i = 1 To $aWork[0][0]
	$aWork[$i][0] = Run('"' & @AutoItExe & '" /AutoIt3ExecuteScript "' & $sFile & '" ' & _
			Random(100, 1000), '', @SW_HIDE, $STDOUT_CHILD)
Next
$iStart = TimerInit()
While TimerDiff($iStart) < 3000
	For $i = 1 To $aWork[0][0]
		If Not $aWork[$i][2] Then
			If $aWork[$i][0] Then
				$aWork[$i][1] &= StdoutRead($aWork[$i][0])
				If @error Then
					$aWork[$i][2] = 1
					$aWork[0][1] -= 1
				EndIf
			EndIf
		EndIf
	Next
	If Not $aWork[0][1] Then ExitLoop
	Sleep(10)
WEnd
For $i = 1 To $aWork[0][0]
	If ProcessExists($aWork[$i][0]) Then
		ProcessClose($aWork[$i][0])
	EndIf
Next
ReDim $aWork[6][2]
_ArrayDisplay($aWork)
И смотрим, что он(и) нам вернули.
 

AlexxxMksv

Новичок
Сообщения
39
Репутация
0
madmasles сказал(а):
lorents [?]
А как быть в с выводом информации?
Простой пример.
Файл test.au3 (должен лежать рядом со следующим файлом):
Код:
#NoTrayIcon
If Not $CmdLine[0] Then
	ConsoleWrite('No $CmdLine' & @LF)
	Exit
EndIf
$iNum = $CmdLine[1]
For $i = 2 To 12
	$iNum += Random(100, 1000)
	Sleep(Random(50, 100, 1))
Next
ConsoleWrite($CmdLine[1] & ' --> ' & $iNum)
Его запускаем 5 раз одновременно этим кодом:
Код:
#include <Array.au3>
#include <Constants.au3>

Dim $aWork[6][3] = [[5, 5]]

$sFile = @ScriptDir & '\test.au3'
For $i = 1 To $aWork[0][0]
	$aWork[$i][0] = Run('"' & @AutoItExe & '" /AutoIt3ExecuteScript "' & $sFile & '" ' & _
			Random(100, 1000), '', @SW_HIDE, $STDOUT_CHILD)
Next
$iStart = TimerInit()
While TimerDiff($iStart) < 3000
	For $i = 1 To $aWork[0][0]
		If Not $aWork[$i][2] Then
			If $aWork[$i][0] Then
				$aWork[$i][1] &= StdoutRead($aWork[$i][0])
				If @error Then
					$aWork[$i][2] = 1
					$aWork[0][1] -= 1
				EndIf
			EndIf
		EndIf
	Next
	If Not $aWork[0][1] Then ExitLoop
	Sleep(10)
WEnd
For $i = 1 To $aWork[0][0]
	If ProcessExists($aWork[$i][0]) Then
		ProcessClose($aWork[$i][0])
	EndIf
Next
ReDim $aWork[6][2]
_ArrayDisplay($aWork)
И смотрим, что он(и) нам вернули.



Очень заинтересовался этим примером, но вот почему у меня после компиляции скрипт не работает.
@ScriptDir после компиляции выдает, конечно же другой путь.
До компиляции @ScriptDir возвращает "C:\Program Files (x86)\AutoIt3\AutoIt3.exe", в этом случае все работает.
Если я вместо @ScriptDir впишу "C:\Program Files (x86)\AutoIt3\AutoIt3.exe", тогда скомпилированный скрипт тоже работает, так что же без AutoIt3.exe мой скомпилированный скрипт работать не будет?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
AlexxxMksv,
Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.
 

InnI

AutoIT Гуру
Сообщения
4,573
Репутация
1,270
AlexxxMksv [?]
До компиляции @ScriptDir возвращает "C:\Program Files (x86)\AutoIt3\AutoIt3.exe"
Во-первых, вы путаете макросы @ScriptDir и @AutoItExe.
Во-вторых, для корректной работы второго скрипта на версии 3.3.12.0 нужно добавить
Код:
#pragma compile(AutoItExecuteAllowed, true)
 
Верх