PureBasic

Runtime (Время выполнения)


Синтаксис
Runtime Variable
Runtime #Constant
Runtime Procedure() declaration
Runtime Enumeration declaration

Описание


Для опытных программистов. Ключевое слово Runtime используется для создания списка программных объектов, таких как Переменные, Константы и Процедуры, к которым можно будет обратиться по их имени (в строковом виде), во время работы программы. Дело в том, что после компиляции программы, в исполняемом файле об именах переменных (констант, процедур и тд) не остается никаких сведений, и имена в строковом виде - бесполезны. Ключевое слово Runtime принуждает компилятор добавить дополнительную ссылку на указанный объект, который затем будет доступен через команды библиотеки Runtime. Такими объектами можно управлять, используя их имя в строковом виде, даже когда программа скомпилирована.

Чтобы увидеть, как можно использовать Runtime, просмотрите библиотеку Dialog, которая использует Runtime для доступа к процедурам событий, связанным с Гаджетами. Здесь имя процедуры, которая будет использоваться обработчиком события, указывается в файле XML (который является текстовым файлом), а затем библиотека Dialog использует функцию GetRuntimeInteger(), чтобы найти адрес процедуры во время выполнения программы. Нет необходимости перекомпилировать программу для ее изменения.

Другим вариантом было бы добавить к программе небольшой язык сценариев реального времени, что упростит изменение открытых переменных, используя значения констант во время этапа выполнения. Хотя это можно сделать вручную, построив карту объектов, ключевое слово Runtime может сделать это стандартным и унифицированным способом.

Пример: процедура

Runtime Procedure OnEvent()
    Debug "OnEvent"
EndProcedure

Debug GetRuntimeInteger("OnEvent()") ; Покажет адрес процедуры


Пример: Перечисления (Enumeration)

Runtime Enumeration
    #Constant1 = 10
    #Constant2
    #Constant3
EndEnumeration

Debug GetRuntimeInteger("#Constant1")
Debug GetRuntimeInteger("#Constant2")
Debug GetRuntimeInteger("#Constant3")


Пример: переменная

Define a = 20
Runtime a

Debug GetRuntimeInteger("a")
SetRuntimeInteger("a", 30)

Debug a ; переменная была изменена


Пример: Вызов функции по ее имени

Prototype Function()

Runtime Procedure Function1()
    Debug "Я вызываю Function1 по имени"
EndProcedure

Runtime Procedure Function2()
    Debug "Я вызываю Function2 по имени"
EndProcedure

Procedure LaunchProcedure(Name.s)
    Protected ProcedureName.Function = GetRuntimeInteger(Name + "()")
    ProcedureName()
EndProcedure

LaunchProcedure("Function1") ; Отобразит "Я вызываю Function1 по имени"
LaunchProcedure("Function2") ; Отобразит "Я вызываю Function2 по имени"


Пример: можно использовать значение цикла для формирования имени объекта.

Define.i var0=10, var1=11, var2=12, var3=13, var4=14, var5=15
Runtime var0, var1, var2, var3, var4, var5
For i=0 To 5
    Debug GetRuntimeInteger("var"+ i)
Next


Пример: с помощью Runtime можно получить доступ к приватным переменным модуля.

DeclareModule x
    Declare Get()
EndDeclareModule

Module x
    Global z=0
    Runtime z

    Procedure Get()
        ProcedureReturn z
    EndProcedure
EndModule

Debug x::Get()
SetRuntimeInteger("x::z", 100)
Debug x::Get()