- Сообщения
- 8,673
- Репутация
- 2,485
- Версия AutoIt
- 3.3.14.5
- Версия
- 0.3
FuncExecute - Вызов функции без задержки, с возможностью указания Callback функции принимающей результат выполнения.
Имеются две основные функции использования:
FuncExecute_Start - Запуск функции во внешнем процессе.
_FuncExecute_Stop - Остановка вызванной ранее функции.
П.С
Вдохновение навеяно этим постом.
Имеются две основные функции использования:
FuncExecute_Start - Запуск функции во внешнем процессе.
Параметр | Описание |
$sFunc | Имя вызываемой функции (может быть как пользовательская, так и встроенная функция) |
$sParams | Передаваемые параметры (только строковые), каждый параметр должен быть разделён символом |. |
$sCallback | Callback функция для обработки возвращаемых значений. Эта функция может принимать следующие параметры: $vRet - Возвращаемое значение от вызванной функции (может быть одномерным массивом). $iErr - Значение @error установленное вызванной функцией. $iPID - ID процесса в котором была вызвана функция. $sFunc - Имя вызванной функции. $sParams - Список параметров переданные вызванной функции. $vCBParam - Дополнительный параметр переданный Callback функции. !!! НЕ задерживайте выполнение этой callback функции, возврат должен произойти как можно скорее !!! |
$vCallbackParam | [Опциональный] Дополнительный параметр передаваемый Callback функции (по умолчанию ""). |
_FuncExecute_Stop - Остановка вызванной ранее функции.
Параметр | Описание |
$hProc | ID процесса который вернула ранее вызванная функция _FuncExecute_Start. |
Код:
#include 'FuncExecute.au3'
_FuncExecute_Start('_MyCalcFunc', '3', '_Callback', 1)
_FuncExecute_Start('InputBox', 'Title|Prompt:|Text', '_Callback', 2)
_FuncExecute_Start('MsgBox', '52|FuncExecute Example #1|Simple message box, OK?', '_Callback', 3)
While _FuncExecute_Count() > 0
Sleep(100)
WEnd
;This function get triggered only after the called function has finished
Func _Callback($sRet, $iErr, $iPID, $sFunc, $sParams, $vParam)
Local $sMsg = StringFormat('External call...\n\tPID = %i\n\tCallback Param = %s\n\tFunc = %s\n\tParams: %s\nReturn:\n\t%s%s\nError:\n\t%i', _
$iPID, $vParam, $sFunc, $sParams, $sRet, ($sRet = 6 ? ' (OK)' : ''), $iErr)
ConsoleWrite($sMsg & @CRLF & '================================' & @CRLF & @CRLF)
EndFunc
Func _MyCalcFunc($iNumber)
Return $iNumber & ' Is Even = ' & (Mod($iNumber, 2) = 0)
EndFunc
Код:
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WinAPIShPath.au3>
#include 'FuncExecute.au3'
Global $aDirs[][3] = [[_WinAPI_PathCanonicalize(@AutoItExe & '\..')], [@ProgramFilesDir], [@WindowsDir], [@TempDir], [@ScriptDir]]
$hGUI = GUICreate('FuncExecute Example #2', 500, 400)
$iStart_Bttn = GUICtrlCreateButton('Get Size', 20, 20, 70, 20)
$iStop_Bttn = GUICtrlCreateButton('Stop', 100, 20, 70, 20)
GUICtrlSetState($iStop_Bttn, $GUI_DISABLE)
$iLV = GUICtrlCreateListView('Path|Size', 20, 50, 460, 310)
For $i = 0 To UBound($aDirs) - 1
$aDirs[$i][1] = GUICtrlCreateListViewItem($aDirs[$i][0] & '|N/A', $iLV)
Next
GUICtrlSendMsg($iLV, $LVM_SETCOLUMNWIDTH, 0, 350)
GUICtrlSendMsg($iLV, $LVM_SETCOLUMNWIDTH, 1, 100)
$iStatus_Lbl = GUICtrlCreateLabel('Press "Get Size" Button', 20, 370, 460, 20)
GUICtrlSetColor($iStatus_Lbl, 0xFF0000)
GUISetState(@SW_SHOW, $hGUI)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
For $i = 0 To UBound($aDirs) - 1
_FuncExecute_Stop($aDirs[$i][2])
Next
Exit
Case $iStart_Bttn
GUICtrlSetState($iStop_Bttn, $GUI_ENABLE)
GUICtrlSetState($iStart_Bttn, $GUI_DISABLE)
GUICtrlSetData($iStatus_Lbl, 'Please wait, collecting data...')
For $i = 0 To UBound($aDirs) - 1
GUICtrlSetData($aDirs[$i][1], $aDirs[$i][0] & '|Wait...')
$aDirs[$i][2] = _FuncExecute_Start('DirGetSize', $aDirs[$i][0], '_DirSetSize_Callback', $aDirs[$i][1])
Next
Case $iStop_Bttn
If MsgBox(52, 'Attention', 'Are you sure, Stop collecting data?', 0, $hGUI) <> 6 Then
ContinueLoop
EndIf
For $i = 0 To UBound($aDirs) - 1
If _FuncExecute_Stop($aDirs[$i][2]) Then
GUICtrlSetData($aDirs[$i][1], $aDirs[$i][0] & '|N/A')
EndIf
Next
GUICtrlSetData($iStatus_Lbl, 'Press "Get Size" Button')
GUICtrlSetState($iStop_Bttn, $GUI_DISABLE)
GUICtrlSetState($iStart_Bttn, $GUI_ENABLE)
EndSwitch
WEnd
Func _DirSetSize_Callback($iSize, $iErr, $iPID, $sFunc, $sParams, $iLVItemID)
GUICtrlSetData($iLVItemID, $sParams & '|' & _ByteSuffix($iSize))
If _FuncExecute_Count() <= 1 Then
GUICtrlSetData($iStatus_Lbl, 'Done!')
GUICtrlSetState($iStop_Bttn, $GUI_DISABLE)
GUICtrlSetState($iStart_Bttn, $GUI_ENABLE)
EndIf
EndFunc
Func _ByteSuffix($iBytes)
Local $iIndex = 0, $aArray = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
While $iBytes > 1023
$iIndex += 1
$iBytes /= 1024
WEnd
Return Round($iBytes, 2) & ' ' & $aArray[$iIndex]
EndFunc
* Эта библиотека регистрирует сообщение WM_COPYDATA, если ваш скрипт или другая библиотека использует это сообщение, необходимо сделать вызов
* Эта библиотека устанавливает директиву #NoTrayIcon, поэтому по умолчанию иконка в системном лотке спрятана. Для отображения иконки в вашем скрипте используйте
__FE_WM_COPYDATA($hWnd, $iMsg, $wParam, $lParam)
из подобной функции скрипта или библиотеки.* Эта библиотека устанавливает директиву #NoTrayIcon, поэтому по умолчанию иконка в системном лотке спрятана. Для отображения иконки в вашем скрипте используйте
Opt('TrayIconHide', 0)
..v0.3
* Теперь по умолчанию иконка в системном лотке не отображается, для отображения иконки в вашем скрипте используйте
* Изменены примеры.
* Улучшена обработка интеракции. Теперь используются структуры (вместо StdOut) для передачи возвращаемого значения от вызванной функции .
* Добавлена функция _FuncExecute_Count для получения общего числа вызванных функции.
* Добавлена функция _FuncExecute_GetInfo для получения информации о вызванной функции.
* Добавлена поддержка для возврата одномерного массива из вызванной функции.
v0.2
* Библиотека переименована в FuncExecute.
* Изменены примеры.
* Улучшена обработка приёма данных (использование WM_COPYDATA).
* Параметр $sParams в _FuncExecute_Start переименован в $sFuncParams.
+ Добавлен опциональный параметр $vCallbackParam в функцию _FuncExecute_Start.
v0.1
* Первая публичная версия.
* Теперь по умолчанию иконка в системном лотке не отображается, для отображения иконки в вашем скрипте используйте
Opt('TrayIconHide', 0)
. $FE_SHOWTRAYICON убрана.* Изменены примеры.
* Улучшена обработка интеракции. Теперь используются структуры (вместо StdOut) для передачи возвращаемого значения от вызванной функции .
* Добавлена функция _FuncExecute_Count для получения общего числа вызванных функции.
* Добавлена функция _FuncExecute_GetInfo для получения информации о вызванной функции.
* Добавлена поддержка для возврата одномерного массива из вызванной функции.
v0.2
* Библиотека переименована в FuncExecute.
* Изменены примеры.
* Улучшена обработка приёма данных (использование WM_COPYDATA).
* Параметр $sParams в _FuncExecute_Start переименован в $sFuncParams.
+ Добавлен опциональный параметр $vCallbackParam в функцию _FuncExecute_Start.
v0.1
* Первая публичная версия.
П.С
Вдохновение навеяно этим постом.
- Автор
- G.Sandler
- Источник
- Ссылка на источник
Вложения
Последнее редактирование: