|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
19.06.2018, 12:25 | #1 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
Межпроцессная синхронизация
Здравствуйте.
Есть вот такой фрагмент кода (C#): Код:
Если так сказать, "в теории", то всё ли нормально по коду ? Или можно что то изменить в лучшую сторону, и желательно в техническом плане, а не в эстетической "читабельности" кода ... =) Ну там может тайминги подкрутить, или что по серьёзней. Пока я не дошёл до момента, когда нужно будет протестировать, но и вообще, лучше сразу сделать так, что бы работало как положено, ибо тестирование предполагается в процессе непосредственно рабочем, когда уже должно быть всё налажено. Во всяком случае, при работе одной программы всё работает нормально; нужно что бы при работе нескольких программ процессы не дрались за буфер обмена.
Подпись ? Не, не слышал ...
|
19.06.2018, 13:29 | #2 |
Старожил
Регистрация: 26.04.2008
Сообщений: 2,645
|
Буфер обмена можно отслеживать с помощью WM_DRAWCLIPBOARD и WM_CHANGECBCHAIN, и не нужно будет вручную циклически его мониторить.
Методы ожидание мьютекса уже присутствует в классе, WaitOne и подобное в зависимости от задачи https://msdn.microsoft.com/ru-ru/lib...v=vs.110).aspx |
19.06.2018, 13:51 | #3 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,357
|
Зачем создавать мьютекс каждый раз?
Зачем он вообще нужен - работа с клипбордом (да и любое WIN32 API) потокобезопасно. Собственно, из приведенного фрагмента понятно только про сам мьютекс, который по сути излишен. Сама концепция таймера порочна по своей сути, кроме случаев, когда нужен timeout или нет сигнала. |
19.06.2018, 14:24 | #4 | ||
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Цитата:
Цитата:
|
||
19.06.2018, 20:33 | #5 | |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
У меня нет ссылок на объект мютекса, который был создан когда либо в каком либо другом процессе. Мне должно помочь это ?
Да это так, но конфликты происходят на уровне данных. Одна программа пытается пропихнуть свой набор данных, другая - тоже свой. И без синхронизации будет происходить произвольная замена данных в буфере: процесс 1 разместил свои данные, но по каким либо причинам не успел их выложить до того, как процесс 2 разместил свои данные. В итоге для обоих процессов с изначально разными данными в буфере обмена данные для второго процесса ... А остальное не играет никакой роли в моём вопросе, суть в том, что программе нужно завести данные в буфер обмена, и потом отправить в элемент ChromeDriver'а комбинацию клавиш Ctrl+V. Вместо посимвольного ввода всего текста через SendKeys. Уже много воды. Из этого понятно, что если будут происходить выше описанные конфликты между процессами - будут выше описанные проблемы. Не таймер, я просто воткнул задержку, что бы процесс не грузил систему. Цитата:
Линк, разве не будет выпадать страшный WaitHandleCannotBeOpenedException ? Яж поэтому и взял в try-catch ... Чёт сложна, это либо "первый хост, остальные дочерние", либо как это было бы правильно - хост это отдельный процесс, то есть - отдельная программа, а рабочие процессы собственно дочерние. Головняк какой то ...
Подпись ? Не, не слышал ...
|
|
19.06.2018, 20:45 | #6 | |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,357
|
Цитата:
Не знаю зачем надо изгаляться таким образом, ну да ладно, дело хозяйское. Просто создайте мьютекс один раз при запуске процесса и только делайте lock/unlock. Имена мюьтексов глобальны (с оговорками, но вам не до них). |
|
19.06.2018, 21:17 | #7 | |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
То что мютекс глобальный в пределах домена я знаю ... =)
Ну да, это в одном процессе, а у меня предполагается несколько. И если я правильно понял эти слова Цитата:
Тогда сначала OpenExisting, и если я получил WaitHandleCannotBeOpenedException - то только тогда создавать мютекс. Если же я не правильно понял эти слова - то тогда не важно, откуда я получу исключение. Вот так тогда да, WaitOne-ReleaseMutex и полетели. В смысле ? Получены кем ? Буфером ?
Подпись ? Не, не слышал ...
|
|
20.06.2018, 00:15 | #8 | |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,357
|
Цитата:
Весь смысл именованных ресурсов в том, чтоб они были доступны из разных процессов. |
|
20.06.2018, 01:30 | #9 | |||
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Цитата:
Цитата:
Цитата:
|
|||
20.06.2018, 05:21 | #10 | ||
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
Про бесконечный цикл не мои слова. Я думал тут все поняли о чём речь ...
Но не это важно, важно то, что в конструкторе выполняется ожидание, вместо положенного по сути WaitHandleCannotBeOpenedException, иль чего нибудь ещё. Независимо от того, заперт существующий мютекс, или нет. Он уже есть - знать попытка создать такой же должна закончиться эксепшеном. Где то здесь же мне и рассказывали, где-где, а вот в конструкторе точно не должно быть никаких "ожидающих" циклов. Ну то и ладно, не я создавал, и не мне судить. Пока один "заблокировал буфер", остальные курят эксепшн до тех пор, пока первый не освободит буфер. И да, без синхронизации эксепшенов не будет. Как мы уже выяснили - эксепшенов вообще не будет, ибо в системе образуется мютекс с таким же именем, и тут же запирается. Хотя опять же, эксепшн может и успеет вылететь, если мютекс был создан, но по каким либо причинам ещё не успел закрыться. Цитата:
Здесь я пришёл узнать, как улучшить эту конструкцию, и мы пришли к выводу, что лучше сразу создать мютекс, открывать существующий из других процессов, и играться блокировками: Код:
Уж не тот ли, у кого первого закончится тайминг перед проверкой ? Или там что то по серьёзней типа очереди ? Цитата:
Для этого я здесь, объясняю =)
Подпись ? Не, не слышал ...
Последний раз редактировалось OmegaBerkut; 20.06.2018 в 06:41. |
||
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Синхронизация | kuba1981 | PHP | 9 | 06.05.2013 11:39 |
Синхронизация БД | Bright-rider | БД в Delphi | 3 | 19.06.2012 07:32 |
Межпроцессная комуникация(Windows)mailslots | Flattery | Win Api | 0 | 10.12.2011 13:41 |
Синхронизация | kostyan142 | Общие вопросы по Java, Java SE, Kotlin | 6 | 13.01.2010 01:39 |
Синхронизация | yarilo | Софт | 2 | 07.08.2009 15:50 |