Глобальные переменные
Общие для всех потоков и шаблонов в рамках одного 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() ?? "";