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

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 315
Благодарностей
869
Баллы
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
Сообщения
120
Благодарностей
87
Баллы
28
Выдано предупреждение за хамское поведение.

Nord

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

Dr.Pipetka

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

Ахилес

Client
Read only
Регистрация
11.11.2020
Сообщения
956
Благодарностей
393
Баллы
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
Сообщения
120
Благодарностей
87
Баллы
28

Pendolf

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

Pendolf

Client
Регистрация
25.11.2019
Сообщения
120
Благодарностей
87
Баллы
28
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 685
Благодарностей
4 642
Баллы
113
не забудьте проверить занято ли состояние занятости
 
  • Спасибо
Реакции: kagorec

Ахилес

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

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

Pendolf

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

Pendolf

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

doc

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

Pendolf

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

Pendolf

Client
Регистрация
25.11.2019
Сообщения
120
Благодарностей
87
Баллы
28

Вложения

Pendolf

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

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 315
Благодарностей
869
Баллы
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
Сообщения
120
Благодарностей
87
Баллы
28
У кого проблемы с кодом, попробуйте этот вариант:
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
Сообщения
120
Благодарностей
87
Баллы
28

Pendolf

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

Dr.Pipetka

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

Pendolf

Client
Регистрация
25.11.2019
Сообщения
120
Благодарностей
87
Баллы
28

Dr.Pipetka

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

doc

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

Dr.Pipetka

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

Pendolf

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

doc

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

Pierre Paul Jacques

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

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

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

zarufakis

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

kagorec

Client
Регистрация
24.08.2013
Сообщения
994
Благодарностей
540
Баллы
93
С вставкой из буфера работал шаблон хорошо но периодически буфер переплетался.
Сделал в итоге вставку в форму по старинке в textarea не по value, а по innertext
 

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