Что нового

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

bulldog5293

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

AZJIO

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

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

bulldog5293

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

Belfigor

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 552
Репутация
2 429
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 597
Репутация
938
То что она решена не забудь отметить ;)
 

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 483
Репутация
1 216
AlexxxMksv [?]
До компиляции @ScriptDir возвращает "C:\Program Files (x86)\AutoIt3\AutoIt3.exe"
Во-первых, вы путаете макросы @ScriptDir и @AutoItExe.
Во-вторых, для корректной работы второго скрипта на версии 3.3.12.0 нужно добавить
Код:
#pragma compile(AutoItExecuteAllowed, true)
 

AlexxxMksv

Новичок
Сообщения
39
Репутация
0
InnI сказал(а):
Во-вторых, для корректной работы второго скрипта на версии 3.3.12.0 нужно добавить
Код:
#pragma compile(AutoItExecuteAllowed, true)

Помогло, спасибо
 
Верх