Сниппет вставки из буфера обмена для ZennoPoster (многопоточный, с блокировками) [Дон шампиньон]

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 234
Благодарностей
804
Баллы
113
Решение для многопотока:


lock(SyncObjects.InputSyncer) // блокировка потока
{
string text = project.Variables["Your_Text"].Value;

// сохраняем текущее состояние буфера
String previous_text = null;
previous_text = System.Windows.Forms.Clipboard.GetText();

// сохраняем объедененный вами ранее текст в буфер производим действие {CTRL+V}
System.Windows.Forms.Clipboard.SetText(text);
instance.ActiveTab.KeyEvent("v","press","ctrl");

// чистим буфер и возвращаем его к первоначальному состоянию
System.Windows.Forms.Clipboard.Clear();
System.Windows.Forms.Clipboard.SetText(previous_text);
}
А это уже просто скопированный первый пост...
 
  • Спасибо
Реакции: kagorec

Pendolf

Client
Регистрация
25.11.2019
Сообщения
46
Благодарностей
5
Баллы
8
Выдано предупреждение за хамское поведение.

Nord

Client
Регистрация
22.03.2012
Сообщения
2 373
Благодарностей
1 433
Баллы
113

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 234
Благодарностей
804
Баллы
113

Ахилес

Client
Регистрация
11.11.2020
Сообщения
846
Благодарностей
344
Баллы
63
Решение для многопотока:


lock(SyncObjects.InputSyncer) // блокировка потока
{
string text = project.Variables["Your_Text"].Value;

// сохраняем текущее состояние буфера
String previous_text = null;
previous_text = System.Windows.Forms.Clipboard.GetText();

// сохраняем объедененный вами ранее текст в буфер производим действие {CTRL+V}
System.Windows.Forms.Clipboard.SetText(text);
instance.ActiveTab.KeyEvent("v","press","ctrl");

// чистим буфер и возвращаем его к первоначальному состоянию
System.Windows.Forms.Clipboard.Clear();
System.Windows.Forms.Clipboard.SetText(previous_text);
}
Почему код крашится и вводит иногда пустоту, в многопотоке ?

118233

118234
 

Pendolf

Client
Регистрация
25.11.2019
Сообщения
46
Благодарностей
5
Баллы
8

Pendolf

Client
Регистрация
25.11.2019
Сообщения
46
Благодарностей
5
Баллы
8
Расставьте паузы.
А лучше синхронизируйте действие между потоками путем записи в ТХТ файл состояний работы со сниппетом, это исключает эту ошибку.
А именно добавив перед кодом вставки запись в файл, после удалите записи из файла, для того чтобы следующий поток занял состояние занятости. Но перед кодом добавьте проверку на состояние занятости потока.:cl:
 

Pendolf

Client
Регистрация
25.11.2019
Сообщения
46
Благодарностей
5
Баллы
8
100% способ вставки из переменной:

string textToPaste = project.Variables["text"].Value;
System.Windows.Forms.Clipboard.SetText(textToPaste);
instance.ActiveTab.KeyEvent("v", "press", "ctrl");
Используйте это решение с логикой представленной выше.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
не забудьте проверить занято ли состояние занятости
 
  • Спасибо
Реакции: kagorec

Ахилес

Client
Регистрация
11.11.2020
Сообщения
846
Благодарностей
344
Баллы
63
А лучше синхронизируйте действие между потоками путем записи в ТХТ файл состояний работы со сниппетом, это исключает эту ошибку.
А именно добавив перед кодом вставки запись в файл, после удалите записи из файла, для того чтобы следующий поток занял состояние занятости. Но перед кодом добавьте проверку на состояние занятости потока.:cl:
паузы... файл... состояние занятости *HAHA*

А вы можете просто выложить рабочий код, для многопотока, а не вот это все непотребство ?
 
  • Спасибо
Реакции: Dr.Pipetka

Pendolf

Client
Регистрация
25.11.2019
Сообщения
46
Благодарностей
5
Баллы
8
Выдано предупреждение за хамское поведение.

Pendolf

Client
Регистрация
25.11.2019
Сообщения
46
Благодарностей
5
Баллы
8
Выдано предупреждение за хамское поведение.

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
сколько пафоса от человека, который просто скопировал->вставил код из поста
 
  • Спасибо
Реакции: Dr.Pipetka

Pendolf

Client
Регистрация
25.11.2019
Сообщения
46
Благодарностей
5
Баллы
8
сколько пафоса от человека, который просто скопировал->вставил код из поста
И от форума, на котором сниппет с ошибкой существует больше 5ти лет.
 

Pendolf

Client
Регистрация
25.11.2019
Сообщения
46
Благодарностей
5
Баллы
8

Вложения

Pendolf

Client
Регистрация
25.11.2019
Сообщения
46
Благодарностей
5
Баллы
8
Пример в котором вместо сниппета на вставку сохраняется профиль.
 

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 234
Благодарностей
804
Баллы
113
У кого проблемы с кодом, попробуйте этот вариант:
C#:
lock(SyncObjects.InputSyncer)
{
    var descr = project.Variables["content"].Value;
    if(descr == "")
    {
        //return -1; // Если надо выти по зеленой в случае пустой переменной
        throw new Exception("Переменная для вставки из буфера пуста!"); // Если надо выти по красной в случае пустой переменной
    }
   
    // Сохраняем ВСЕ данные из буфера обмена (не только текст)
    System.Windows.Forms.IDataObject dataObject = System.Windows.Forms.Clipboard.GetDataObject();
    var previousData = new System.Windows.Forms.DataObject();
    foreach (var format in dataObject.GetFormats())
    {
        previousData.SetData(format, dataObject.GetData(format));
    }
   
    // Сохраняем нужный текст в буфер обмена
    System.Windows.Forms.Clipboard.SetText(descr);
   
    // Вставляем текст с помощью комбинации клавиш "Ctrl+V"
    instance.ActiveTab.KeyEvent("v", "press", "ctrl");
   
    // Очищаем буфер обмена
    System.Windows.Forms.Clipboard.Clear();
   
    // Восстанавливаем ВСЕ предыдущие данные в буфер обмена
    foreach (var format in previousData.GetFormats())
    {
        System.Windows.Forms.Clipboard.SetData(format, previousData.GetData(format));
    }
}
В бою не проверял, но пару ошибок должно убрать.
 

Pendolf

Client
Регистрация
25.11.2019
Сообщения
46
Благодарностей
5
Баллы
8
У кого проблемы с кодом, попробуйте этот вариант:
C#:
lock(SyncObjects.InputSyncer)
{
    var descr = project.Variables["content"].Value;
    if(descr == "")
    {
        //return -1; // Если надо выти по зеленой в случае пустой переменной
        throw new Exception("Переменная для вставки из буфера пуста!"); // Если надо выти по красной в случае пустой переменной
    }
  
    // Сохраняем ВСЕ данные из буфера обмена (не только текст)
    System.Windows.Forms.IDataObject dataObject = System.Windows.Forms.Clipboard.GetDataObject();
    var previousData = new System.Windows.Forms.DataObject();
    foreach (var format in dataObject.GetFormats())
    {
        previousData.SetData(format, dataObject.GetData(format));
    }
  
    // Сохраняем нужный текст в буфер обмена
    System.Windows.Forms.Clipboard.SetText(descr);
  
    // Вставляем текст с помощью комбинации клавиш "Ctrl+V"
    instance.ActiveTab.KeyEvent("v", "press", "ctrl");
  
    // Очищаем буфер обмена
    System.Windows.Forms.Clipboard.Clear();
  
    // Восстанавливаем ВСЕ предыдущие данные в буфер обмена
    foreach (var format in previousData.GetFormats())
    {
        System.Windows.Forms.Clipboard.SetData(format, previousData.GetData(format));
    }
}
В бою не проверял, но пару ошибок должно убрать.
между проектами работает?
 

Pendolf

Client
Регистрация
25.11.2019
Сообщения
46
Благодарностей
5
Баллы
8

Pendolf

Client
Регистрация
25.11.2019
Сообщения
46
Благодарностей
5
Баллы
8
все равно встречаются вилки с буфером обмена.
единственный верный вариант кодом, это генерировать виртуальный буфер обмена для каждого инстанса и работать с ним отдельно.
 

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 234
Благодарностей
804
Баллы
113

Pendolf

Client
Регистрация
25.11.2019
Сообщения
46
Благодарностей
5
Баллы
8

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 234
Благодарностей
804
Баллы
113
Выдано предупреждение за неприемлемое поведение.
Вилка одновременной сработки сниппета во время работы нескольких проектов с буфером обмена, буфер есть лишь один и точка.
Ой бля, иди в притоне дальше неси хуйню.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
Ах. Вот если бы существовал какой-то механизм, с помощью которого можно было бы формировать очередь на доступ к каким-то ресурсам...
 
  • Спасибо
Реакции: Dr.Pipetka

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 234
Благодарностей
804
Баллы
113
Ах. Вот если бы существовал какой-то механизм, с помощью которого можно было бы формировать очередь на доступ к каким-то ресурсам...
Ага, напрмер лок) lock(SyncObjects.InputSyncer)
 
  • Спасибо
Реакции: Pierre Paul Jacques и doc

Pendolf

Client
Регистрация
25.11.2019
Сообщения
46
Благодарностей
5
Баллы
8
Ах. Вот если бы существовал какой-то механизм, с помощью которого можно было бы формировать очередь на доступ к каким-то ресурсам...
Этим механизмом являетесь вы)
 
  • Спасибо
Реакции: Pierre Paul Jacques

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
  • Спасибо
Реакции: Pierre Paul Jacques

Pierre Paul Jacques

Активный пользователь
Регистрация
08.10.2023
Сообщения
117
Благодарностей
33
Баллы
28
Привет, у меня тоже такая беда:
Изолировать буфер обмена на несколько потоков, чтобы избежать смешивания данных?

Если вы нашли решение, пожалуйста, не могли бы вы ответить здесь на русском языке?
или в моем английском посте
:

Большое спасибо
 

zarufakis

Client
Регистрация
22.03.2019
Сообщения
1 525
Благодарностей
883
Баллы
113
В свое время тоже мучатся с этим дрочем. В конечном итоге, проект переписал на Post\Get, т.к. это единственный адекватный вариант.
 
Последнее редактирование:

kagorec

Client
Регистрация
24.08.2013
Сообщения
922
Благодарностей
476
Баллы
63
С вставкой из буфера работал шаблон хорошо но периодически буфер переплетался.
Сделал в итоге вставку в форму по старинке в textarea не по value, а по innertext
 
  • Спасибо
Реакции: Pierre Paul Jacques

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