Что нового

FuncExecute - Вызов функции без задержки

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,613
Репутация
2,440
Версия AutoIt
3.3.14.5
Версия
0.3
FuncExecute - Вызов функции без задержки, с возможностью указания Callback функции принимающей результат выполнения.

Имеются две основные функции использования:
FuncExecute_Start - Запуск функции во внешнем процессе.
ПараметрОписание
$sFuncИмя вызываемой функции (может быть как пользовательская, так и встроенная функция)
$sParamsПередаваемые параметры (только строковые), каждый параметр должен быть разделён символом |.
$sCallbackCallback функция для обработки возвращаемых значений. Эта функция может принимать следующие параметры:

$vRet - Возвращаемое значение от вызванной функции (может быть одномерным массивом).
$iErr - Значение @error установленное вызванной функцией.
$iPID - ID процесса в котором была вызвана функция.
$sFunc - Имя вызванной функции.
$sParams - Список параметров переданные вызванной функции.
$vCBParam - Дополнительный параметр переданный Callback функции.

!!! НЕ задерживайте выполнение этой callback функции, возврат должен произойти как можно скорее !!!
$vCallbackParam[Опциональный] Дополнительный параметр передаваемый Callback функции (по умолчанию "").

_FuncExecute_Stop - Остановка вызванной ранее функции.
ПараметрОписание
$hProcID процесса который вернула ранее вызванная функция _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, если ваш скрипт или другая библиотека использует это сообщение, необходимо сделать вызов __FE_WM_COPYDATA($hWnd, $iMsg, $wParam, $lParam) из подобной функции скрипта или библиотеки.
* Эта библиотека устанавливает директиву #NoTrayIcon, поэтому по умолчанию иконка в системном лотке спрятана. Для отображения иконки в вашем скрипте используйте Opt('TrayIconHide', 0)..

v0.3
* Теперь по умолчанию иконка в системном лотке не отображается, для отображения иконки в вашем скрипте используйте 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
Источник
Ссылка на источник

Вложения

  • CallExternal.zip
    6.9 КБ · Просмотры: 9
  • FuncExecute.zip
    4.8 КБ · Просмотры: 11
  • FuncExecute_v0.3.zip
    5.5 КБ · Просмотры: 10
Последнее редактирование:
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,613
Репутация
2,440
v0.2
* Библиотека переименована в FuncExecute ("психанул ©").
* Изменены примеры.
* Улучшена обработка приёма данных (использование WM_COPYDATA).
* Параметр $sParams в _FuncExecute_Start переименован в $sFuncParams.
+ Добавлен опциональный параметр $vCallbackParam в функцию _FuncExecute_Start.

Важные примечания:
* Эта библиотека регистрирует сообщение WM_COPYDATA, если ваш скрипт или другая библиотека использует это сообщение, необходимо сделать вызов __FE_WM_COPYDATA($hWnd, $iMsg, $wParam, $lParam) из подобной функции скрипта или библиотеки.
* Эта библиотека устанавливает директиву #NoTrayIcon, но по умолчанию иконка в системном лотке отображается. Можете задать значение 0 переменной $FE_SHOWTRAYICON чтобы оставить #NoTrayIcon.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,613
Репутация
2,440
Кстати может у кого то есть идеи как можно не используя #NoTrayIcon полностью спрятать иконку при запуске скрипта, а точнее сделать так чтобы она вовсе не показывалась как при #NoTrayIcon?
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Кстати может у кого то есть идеи как можно не используя #NoTrayIcon полностью спрятать иконку при запуске скрипта, а точнее сделать так чтобы она вовсе не показывалась как при #NoTrayIcon?
В чем проблема использовать #NoTrayIcon? Иконка ведь все равно появится при необходимости, если использовать
Код:
Opt("TrayIconHide", 0)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,613
Репутация
2,440
Новая версия:
v0.3
* Теперь по умолчанию иконка в системном лотке не отображается, для отображения иконки в вашем скрипте используйте Opt('TrayIconHide', 0). $FE_SHOWTRAYICON убрана.
* Изменены примеры.
* Улучшена обработка интеракции. Теперь используются структуры (вместо StdOut) для передачи возвращаемого значения от вызванной функции .
* Добавлена функция _FuncExecute_Count для получения общего числа вызванных функции.
* Добавлена функция _FuncExecute_GetInfo для получения информации о вызванной функции.
* Добавлена поддержка для возврата одномерного массива из вызванной функции.
 
Верх