Как в фоновом процессе получить доступ к инстансу и закрывать вкладки.

SlvStr

Новичок
Регистрация
16.12.2024
Сообщения
5
Благодарностей
0
Баллы
1
Приветствую!
В процессе работы скрипта постоянно открываются новые вкладки, которые нужно сразу закрыть.
Разобрался как это сделать (нашел пример на форуме), но оно не работает в фоне (насколько я понимаю, фоновые процессы не имеют доступа к основному инстансу).

Подскажите пожалуйста, как это можно реализовать иначе?

C#:
namespace ZennoLab.OwnCode
{
    public class CommonCode
    {
        IZennoPosterProjectModel project;
        Instance instance;

        public CommonCode(IZennoPosterProjectModel _project, Instance _instance)
        {
            instance = _instance;
            project = _project;
        }

        public void CloseTabs()
        {
            Thread thread = new Thread(new ThreadStart(() =>
            {
                int i = 0;

                while (i < 3)
                {
                    project.SendInfoToLog($"проход: {i}"); // эта строка принтится

                    if (instance != null)
                    {
                        Tab[] allTabs = instance.AllTabs;
                        for (int k = 1; k < allTabs.Length; k++) // без thread.Join(); в этот блок не попадаем
                        {
                            allTabs[k].Close();
                        }

                        Thread.Sleep(3000);
                    }

                    i++;
                }
            }));

       
            thread.IsBackground = true;
            thread.Start();

            // thread.Join(); с этой строчкой отрабатывает 1 раз в общем потоке. без нее приходит какой то пустой инстанс
        }
    }
}

в фоне выполняется, но табы не закрывает, не может их найти
 
Последнее редактирование:

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 564
Благодарностей
9 179
Баллы
113
Приветствую!
В процессе работы скрипта постоянно открываются новые вкладки, которые нужно сразу закрыть.
Разобрался как это сделать (нашел пример на форуме), но оно не работает в фоне (насколько я понимаю, фоновые процессы не имеют доступа к основному инстансу).

Подскажите пожалуйста, как это можно реализовать иначе?

C#:
namespace ZennoLab.OwnCode
{
    public class CommonCode
    {
        IZennoPosterProjectModel project;
        Instance instance;

        public CommonCode(IZennoPosterProjectModel _project, Instance _instance)
        {
            instance = _instance;
            project = _project;
        }

        public void CloseTabs()
        {
            Thread thread = new Thread(new ThreadStart(() =>
            {
                int i = 0;

                while (i < 3)
                {
                    project.SendInfoToLog($"проход: {i}"); // эта строка принтится

                    if (instance != null)
                    {
                        Tab[] allTabs = instance.AllTabs;
                        for (int k = 1; k < allTabs.Length; k++) // без thread.Join(); в этот блок не попадаем
                        {
                            allTabs[k].Close();
                        }

                        Thread.Sleep(3000);
                    }

                    i++;
                }
            }));

      
            thread.IsBackground = true;
            thread.Start();

            // thread.Join(); с этой строчкой отрабатывает 1 раз в общем потоке. без нее приходит какой то пустой инстанс
        }
    }
}

в фоне выполняется, но табы не закрывает, не может их найти
Добрый день.

Этот код не подходит?
instance.CloseAllTabs();
 

SlvStr

Новичок
Регистрация
16.12.2024
Сообщения
5
Благодарностей
0
Баллы
1
Добрый день.

Этот код не подходит?
instance.CloseAllTabs();
Добрый день!

нужно закрывать все кроме первой, но в любом случае не срабатывает.

при обращении к instance в рамках new Thread, который выполняется фоном (без thread.Join), возвращается не то что ожидается, там какой то пустой экземпляр, то есть любые операции с основным instance не работают



Была идея перебирать все открытые инстансы, нашел в документации AllInstances, но пока не понимаю как им воспользоваться
C#:
var str = ZennoPoster.AllInstances[0].ToString();

project.SendInfoToLog(str, true);
по какой-то причине говорит что нет 0 элемента, хотя очевидно, что он запущен
 
Последнее редактирование:

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 564
Благодарностей
9 179
Баллы
113
  • Спасибо
Реакции: SlvStr

Alex91

Активный пользователь
Регистрация
15.08.2024
Сообщения
330
Благодарностей
84
Баллы
28
Чисто теоретически....
Ты запускаешь отдельный поток, внутри объекта...
А объект, создаешь в кубике c# ?
То есть поток работает уже после того как кубик завершился и зенка удалила объект из памяти ?
Верно понимаю ?
 
  • Спасибо
Реакции: SlvStr

SlvStr

Новичок
Регистрация
16.12.2024
Сообщения
5
Благодарностей
0
Баллы
1
Вот так попробуйте:
C#:
Tab[] tabs = instance.AllTabs;
for (int i = 1; i < tabs.Count(); i++)
{
    tabs[i].Close();
}
спасибо, у меня так и написано) проблема с доступом к объекту инстанса в фоне.

разобрался с AllInstances, осталось получить сам инстанс из идентификаторов которые он возвращает, подскажете как? в документации нахожу только GetNewInstance, он нужен?

C#:
foreach (var localInstanceID in ZennoPoster.AllInstances) {
    // localInstanceID содержит ид
    // как получить объект? чтобы уже у него закрывать вкладки
}
 
Последнее редактирование:

SlvStr

Новичок
Регистрация
16.12.2024
Сообщения
5
Благодарностей
0
Баллы
1
Чисто теоретически....
Ты запускаешь отдельный поток, внутри объекта...
А объект, создаешь в кубике c# ?
То есть поток работает уже после того как кубик завершился и зенка удалила объект из памяти ?
Верно понимаю ?
если правильно понял, то да, уже осознал) через отдельную задачу с перебором инстансов сработает же?
 

SlvStr

Новичок
Регистрация
16.12.2024
Сообщения
5
Благодарностей
0
Баллы
1
дошло!

C#:
int i = 1;

var url = "127.0.0.1";
var address = "server";

while(i < 10) {
    foreach (var port in ZennoPoster.AllInstances)
    {
        var localInstance = new Instance(url, port, address);

        project.SendInfoToLog($"очистка: {i}");

        Tab[] allTabs = localInstance.AllTabs;
        for (int k = 1; k < allTabs.Length; k++)
        {
            allTabs[k].Close();
        }
    }

    i++;
    Thread.Sleep(3000);
}
 
Последнее редактирование:

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)