Что нового

Запуск функции вторым процессом (параллельное выполнение)

VadimKHL

Новичок
Сообщения
155
Репутация
0
Всем привет!
Каким способом можно запустить часть кода параллельно основному коду?
Сейчас компилирую отдельный исполнительный файл и запускаю его из основного кода, когда это требуется.
По другому не умею. Но это два exe файла в проекте, что не нравится.

Есть ли варианты как сделать это в одном коде/файле?
 

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
создать один екзешник и в нем прописать, в зависимости с каким параметром запущен, ту часть кода и выполнять.
Пример запущен без параметра, выполнить один код.
Когда требуется выполнить второй код, пусть екзешник запускает себя же но с параметром.
Сообщение автоматически объединено:

Набросок для примера, на быструю руку.
Код:
$sCmd = 'TwoFunc'

If StringInStr($CmdLineRaw, $sCmd) Then
    TwoFunc_()
Else
    OneFunc_()
EndIf

Func OneFunc_()
    If MsgBox(4,0,'Сейчас выполняется OneFunc. Запустить TwoFunc') = 6 Then Run('"'&@ScriptFullPath&'" TwoFunc')
    MsgBox(0,0,'Сейчас выполняется OneFunc')
EndFunc

Func TwoFunc_()
    MsgBox(0,0,'Сейчас выполняется TwoFunc')
EndFunc
 
Последнее редактирование:
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
Не, вопрос не корректно поняли.
Где в данном примере запуск одновременно два куска кода?

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

Если конкретно то что происходит:
Основная прога подключается ко всем COM портам и ищем нужное ей устройство.
Вторая прога, ищет окна запроса пароля (появляются при подключении к COM порту блютуз) и вводит нужный пароль.

Первая прога не может одновременно подключиться к ком порту и отслеживать окна. Поэтому приходить делать два EXE файла,
что бы запускались параллельно. Т.е. требуется запустить два куска кода одновременно!
Сообщение автоматически объединено:

Набросок для примера, на быструю руку.

А блин, дошло как это работает))))) Чот сразу не понял что к чему)
Как вариант норм) Спасибо! Интересное решение.
А еще какие нибудь способы есть?
 

Prog

Продвинутый
Сообщения
597
Репутация
77
А еще какие нибудь способы есть?
Есть - запуск потока WinAPI функцией CreateThread но AutoIt потоки не поддерживает. Можно написать dll на другом языке поддерживающем многопоточность и выполнить часть кода в ней в отдельном потоке.
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
А еще какие нибудь способы есть?
Попробуйте через Run запустить текстовый файл, в котором прописан нужный код. Типа такого:
Код:
#include <MsgBoxConstants.au3>

$iPid = Run(@AutoItExe & ' /AutoIt3ExecuteScript name.txt')

$i = 1
While $i <= 10 ; при верном условии цикл повторяется
    MsgBox(4096, '$i=' & $i, "Значение $i = " & $i, 1)
    $i = $i + 1
WEnd

и содержимое текстового файла:
Код:
#include <MsgBoxConstants.au3>

$j = 100
While $j <= 110 ; при верном условии цикл повторяется
    MsgBox(4096, '$j=' & $j, "Значение $j = " & $j, 1)
    $j = $j + 1
WEnd
 
Последнее редактирование:
Автор
V

VadimKHL

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

Я правильно понимаю, что такой вариант будет работать только если на компе, где работает программа должен быть установлен AutoIT?

Есть - запуск потока WinAPI функцией CreateThread но AutoIt потоки не поддерживает. Можно написать dll на другом языке поддерживающем многопоточность и выполнить часть кода в ней в отдельном потоке.

Если не трудно, можно пример, как это должно работать?
Я новичок, трудно без примеров.
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Я правильно понимаю, что такой вариант будет работать только если на компе, где работает программа должен быть установлен AutoIT?
Не совсем ))) Если нужно скомпилированные файлы запускать, то отдельно компилируете два файла. Только в основном заменяете строку запуска на:
Код:
$iPid = Run('name.exe')
 

Prog

Продвинутый
Сообщения
597
Репутация
77
Это разные процессы, а не многопоточность. Разница в том что процессы полностью изолированы друг от друга. Переменные, функции и др. не связанны между собой.

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

Эта тема неоднократно обсуждалась на форуме http://autoit-script.ru/threads/multipotochnost.19954/
http://autoit-script.ru/threads/vypolnenie-api-bez-priostanovki-skripta.18923/
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Это разные процессы, а не многопоточность
Так и в задаче не стоял вопрос многопоточности. Тут в другом вопрос. Автору не нравится два экзешника.
Разница в том что процессы полностью изолированы друг от друга
Ну а перехват некоторых вещей возможен. В первом, главном скрипте отлавливать второй процесс и его результаты (вывод в окошке и тп), а потом работать с ними. Да и вообще не понятно, что вторая часть кода делает. Может и не пересекается с первой.
Сообщение автоматически объединено:

такой вариант будет работать только если на компе, где работает программа должен быть установлен AutoIT?
По идее можно и не компилировать, но я сколько не читал вот эту справку, так и не понял как.
 
Последнее редактирование:
Автор
V

VadimKHL

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

))) И возвращаемся к тому, от чего хочу уйти. От наличия двух EXE файлов в проекте)
Не имеет смылса писать пример, ведь AutoIt не поддерживает многопоточность. Если запустить несколько потоков, скрипт начнет сильно глючить и вылетать с ошибками. Многопоточность должна поддерживается компилятором/интерпретатором и библиотечными функциями.
В вашем случае решением может стать перенос части кода на другой язык с поддержкой многопотчности и компиляциия кода в dll.

Понял, значит самый адекватный вариант в посте 2. Буду его использовать.
Спасибо всем за помощь!
 
Верх