0 / 0 / 0
Регистрация: 21.03.2017
Сообщений: 24
|
|||||||||||
1 | |||||||||||
Вызов события в MemoryMappedFiles10.09.2018, 17:09. Показов 2795. Ответов 21
Метки memorymappedfile (Все метки)
Приветствую!
Столкнулся с одной проблемой. Создал обмен данными с помощью отражения. Вопрос интересует такой, можно создать событие таким образом, чтобы Приложение 2 при каждом новом полученном сообщении автоматически активировал событие и добавлял сообщение в TEXT_BOX? Примерно как с сокетами. Очень буду благодарен за ответ! Приложение 1
0
|
10.09.2018, 17:09 | |
Ответы с готовыми решениями:
21
Нестабильная работа MemoryMappedFiles Вызов события Click usercontrol Вызов VB.Net диалога из события Word Вызов события из потока: ошибка доступа к элементу управления |
1047 / 898 / 211
Регистрация: 29.09.2015
Сообщений: 1,004
|
|
12.09.2018, 23:07 | 2 |
Создайте таймер, который будет периодически проверять данные, а при наличии изменений вызывать дальнейшее действие или событие
1
|
COM‐пропагандист
|
|
06.11.2018, 12:15 | 3 |
Не надо так делать.
Лучше создайте системный объект‐событие EventWaitHandle с общим именем для всех процессов. После записи данных в файл устанавливайте событие в сигнальное состояние методом Set. Ожидающие данных в файле потоки ждут этого сигнала через WaitOne().
2
|
395 / 314 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
|
|
06.11.2018, 16:57 | 4 |
Замабувараев, а как вся эта штука в сборе работает?
Может пример есть простецкий? Я как-то давно пробовал разобраться, так и не понял толком принцип работы. Сейчас точно не помню, но по-моему исключения какие-то вылетали, что нет доступа.
0
|
COM‐пропагандист
|
||||||
06.11.2018, 21:31 | 5 | |||||
3
|
129 / 108 / 24
Регистрация: 11.07.2017
Сообщений: 274
|
||||||
08.08.2019, 15:54 | 6 | |||||
Замабувараев, спасибо за пример.
Но вот какая проблема. Если потоков больше двух, то сигнал принимает только один поток. Можно ли заставить таким образом оповещать более 2х потоков? Добавлено через 6 минут И да, еще добавлю, чтобы поток завершался вместе с приложением, устанавливать
0
|
129 / 108 / 24
Регистрация: 11.07.2017
Сообщений: 274
|
|||||||||||
09.08.2019, 12:52 | 7 | ||||||||||
Сам задал вопрос, сам же и отвечу.
Убираем AutoReset
1
|
129 / 108 / 24
Регистрация: 11.07.2017
Сообщений: 274
|
|
12.08.2019, 15:36 | 9 |
Да спасибо, книг никаких нет, а методом подбора подходящего Intellisence мне этого не предложил.
0
|
COM‐пропагандист
|
|
18.08.2019, 17:42 | 10 |
Вот здесь есть спецификация по VB.NET https://github.com/dotnet/vblang
0
|
129 / 108 / 24
Регистрация: 11.07.2017
Сообщений: 274
|
||||||
10.09.2019, 14:25 | 11 | |||||
Замабувараев, подскажите пожалуйста.
Вот у меня работают несколько потоков, которые слушают друг друга как описано выше.
Есть ли простой выход из данного затруднения? или придется городить учет всех потоков и дожидаться ответа от каждого.
0
|
129 / 108 / 24
Регистрация: 11.07.2017
Сообщений: 274
|
|
13.09.2019, 08:28 | 12 |
Как вариант, есть метод WaitAll. Он должен принимать массив всех waitHandles. Но как я могу получить этот массив, если у меня они в разных процессах?
Коллеги, есть мысли у кого-то?
0
|
COM‐пропагандист
|
|
16.09.2019, 18:29 | 13 |
Я уже говорил, что необходимо создать событие EventWaitHandle с именем.
https://docs.microsoft.com/en-... em_String_ Затем и обращаться по этому имени из разных процессов. Добавлено через 2 минуты Здесь необходимо передать EventResetMode.ManualReset
0
|
129 / 108 / 24
Регистрация: 11.07.2017
Сообщений: 274
|
||||||
17.09.2019, 07:41 | 14 | |||||
Замабувараев, я и передаю ManualReset и только пославший поток и сбрасывает сигнальное состояние
Моя задача - организовать гарантированное получение сигнала всеми потоками.
0
|
129 / 108 / 24
Регистрация: 11.07.2017
Сообщений: 274
|
|
17.09.2019, 12:21 | 16 |
Нет, у меня работают несколько потоков, которые слушают друг друга. И если один из них отправляет данные в MemoryMappedFile и сигнализирует об этом, то все без исключения потоки должны это прочитать. И когда все прочитают, сбрасывать сигнальное состояние.
Добавлено через 2 минуты А по факту не получается так. Если предоставить право сбрасывать событие установившему потоку, то не факт, что все успеют его получить. Добавлено через 59 минут выше писал.
0
|
COM‐пропагандист
|
|||||||||||
17.09.2019, 13:29 | 17 | ||||||||||
Странная синтаксическая конструкция про потоков, которые слушают друг друга. Интуиция шепчет, что потоки должны ждать событие, а не друг друга. Наверное это просто фигура речи, а не логическая ошибка.
Вообще, я представляю себе код вот так. Есть читающие потоки, которые ждут событие:
Добавлено через 15 минут Вы не читаете, что ли? Уже два раза же:
Сообщение от Корпорация Микрософт
0
|
129 / 108 / 24
Регистрация: 11.07.2017
Сообщений: 274
|
|||||||||||
17.09.2019, 14:34 | 18 | ||||||||||
да, именно так.
У меня все прекрасно работает. Проблема только в том, чтобы до всех потоков дошло событие, т. е. когда сбрасывать сигнальное состояние.
Может мы друг друга не понимаем. Чуть позже выложу свой код. Добавлено через 16 минут
0
|
COM‐пропагандист
|
||||||||||||||||
17.09.2019, 17:38 | 19 | |||||||||||||||
Что сразу бросилось в глаза:
А здесь:
Читающий поток должен работать так:
0
|
129 / 108 / 24
Регистрация: 11.07.2017
Сообщений: 274
|
|
18.09.2019, 07:41 | 20 |
Ну тут логика так задумана. Каждый объект при создании запускает поток. И любой из объектов должен при изменении сообщить остальным, чтобы они также изменились. Поэтому каждый ждет сигнала от остальных. Когда сам меняется - передает другим, или просто должен измениться если другие попросили.
По факту сейчас имею - из 4х работающих объектов (потоков созданных объектом) могут все измениться при изменении одного, но чаще 1, 2 или ни одного вообще. Вот как раз это связано с тем, что сигнал не успевает ко всем попасть. кто-то его должен сбрасывать, вот пока и сделано, что сбрасывает пославший в надежде, что все уже его получили, но увы. Как вариант, есть метод WaitAll. Он должен принимать массив всех waitHandles. Но как я могу получить этот массив, если у меня они обычно в разных процессах? Если бы в одной программе - я бы просто при создании объекта ее eventX добавлял бы в массив, а так придется наверное передавать его через MemoryMappedFile чтоле? И опять надо как то об этом сообщать остальным, либо еще один файл специально для этого создавать, в общем пока тупик.
0
|
18.09.2019, 07:41 | |
18.09.2019, 07:41 | |
Помогаю со студенческими работами здесь
20
Как запретить вызов события Click при нажатии правой кнопки мыши Вызов события у объекта Вызов события из другого события по нажатию клавиши Вызов события из другого события Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |