Глобальные переменные

Общие для всех потоков и шаблонов в рамках одного ZennoPoster. Организованы по пространствам имён (namespace). Можно создавать прямо в коде — не нужно объявлять в ProjectMaker.

← Назад к индексу


Чтение и запись

// Чтение
IGlobalVariable gv = project.GlobalVariables["MyNamespace", "VariableName"];
string value = gv.Value.ToString();
 
// Запись / создание
project.GlobalVariables.SetVariable("Config", "ApiUrl", "https://api.example.com");
project.GlobalVariables.SetVariable("Counters", "Total", "0");

Изменение существующей переменной

IGlobalVariable counter = project.GlobalVariables["Counters", "Total"];
if (counter != null)
{
    int current = int.Parse(counter.Value.ToString());
    current++;
    counter.Value = current.ToString();
}

Потокобезопасный счётчик

Когда несколько потоков меняют одну переменную — нужен lock.

IGlobalVariable counter = project.GlobalVariables["Stats", "Processed"];
if (counter != null)
{
    lock (counter)
    {
        int current = int.Parse(counter.Value.ToString());
        current++;
        counter.Value = current.ToString();
 
        if (current >= 1000)
            project.GlobalVariables.SetVariable("Control", "Stop", "True");
    }
}

Флаги управления потоками

// Установить флаг паузы (из любого потока)
project.GlobalVariables.SetVariable("Control", "Pause", "True");
 
// Проверить флаг в рабочем потоке
string pause = project.GlobalVariables["Control", "Pause"]?.Value?.ToString() ?? "False";
while (pause == "True")
{
    Thread.Sleep(5000);
    pause = project.GlobalVariables["Control", "Pause"]?.Value?.ToString() ?? "False";
}

Кеширование общих данных

// Проверяем кеш
string token  = project.GlobalVariables["Cache", "Token"]?.Value?.ToString() ?? "";
string expiry = project.GlobalVariables["Cache", "TokenExpiry"]?.Value?.ToString() ?? "";
 
bool needNew = string.IsNullOrEmpty(token);
if (!string.IsNullOrEmpty(expiry))
    needNew = DateTime.Now >= DateTime.Parse(expiry);
 
if (needNew)
{
    IGlobalVariable tokenVar = project.GlobalVariables["Cache", "Token"];
    if (tokenVar != null)
    {
        lock (tokenVar)
        {
            // Повторная проверка после захвата lock
            token = tokenVar.Value?.ToString() ?? "";
            if (string.IsNullOrEmpty(token))
            {
                string newToken = GetAuthToken();
                project.GlobalVariables.SetVariable("Cache", "Token", newToken);
                project.GlobalVariables.SetVariable("Cache", "TokenExpiry", DateTime.Now.AddHours(1).ToString());
                token = newToken;
            }
        }
    }
}

Общие настройки для всех потоков

// Инициализация (один раз, в главном потоке)
project.GlobalVariables.SetVariable("Config", "ApiUrl",    "https://api.example.com");
project.GlobalVariables.SetVariable("Config", "Timeout",   "30");
project.GlobalVariables.SetVariable("Config", "UserAgent", "MyBot/1.0");
 
// Использование в любом потоке
string apiUrl    = project.GlobalVariables["Config", "ApiUrl"]?.Value?.ToString() ?? "";
int    timeout   = int.Parse(project.GlobalVariables["Config", "Timeout"]?.Value?.ToString() ?? "30") * 1000;
string userAgent = project.GlobalVariables["Config", "UserAgent"]?.Value?.ToString() ?? "";