2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 142
|
||||||
1 | ||||||
Одновременная передача данных в виде двух массивов через буфер обмена22.05.2019, 10:34. Показов 2191. Ответов 28
Метки нет (Все метки)
Добрый день, пишу программу корреляционного расходомера на основе sdk виртуального осциллографа и столкнулся с проблемой одновременной передачи входящих данных с двух каналов. Проблема заключается в следующем: имеется два входящих сигнала и, соответственно, два одновременно и беспрерывно обновляющихся массива входящих данных, которые нужно одновременно передать на другое приложение для последующей обработки. Как это правильно сделать? Написал что-то подобное, но не уверен в правильности работы:
Используется Visual Studio 2010.
0
|
22.05.2019, 10:34 | |
Ответы с готовыми решениями:
28
Передача файла через буфер обмена RDP и его запуск Копирование через буфер обмена из 2х полей формы и вставка данных в другую форму Буфер обмена(получение и передача информации) Передача параметра в буфер обмена c JavaScript |
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
22.05.2019, 22:43 | 2 |
narsky, я бы не стал использовать буфер обмена для непрерывного обмена данными между процессами.
Есть много других вариантов: 1. Общая область памяти (shared memory), доступ к которой синхронизируется мьютексом; 2. Пайпы (pipes); 3. Сокеты (sockets); 4. ... Добавлено через 8 минут Можно использовать любой из вышеперечисленных механизмов. Если одно приложение запускает другое, то лучше всего подойдут пайпы. Приложения могут запускаться на разных компьютерах, то подойдут только сокеты. Общая область памяти по своей природе почти ничем не отличается от передачи данных через файл.
0
|
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 142
|
|
22.05.2019, 23:22 [ТС] | 3 |
nonedark2008, спасибо, впервые слышу про такой механизм, где можно почитать / поискать наиболее полезные примеры использования пайпов?
0
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
23.05.2019, 00:15 | 4 |
Где почитать зависит от твоего текущего уровня. Я бы начал с документации на MSDN, там есть информация и примеры для C/C++/C#.
А поискать можно в поисковике по ключевым словам вида: winapi, C#, pipes, пайпы, каналы и т.п.
0
|
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 142
|
|||||||||||
31.05.2019, 17:11 [ТС] | 5 | ||||||||||
Реализовал (как мне кажется) передачу данных с помощью пайпа между двумя приложениями, но при попытке вывода на экран первого значения постоянно меняющегося массива возникает следующая ошибка. С чем это может быть связано, как исправить? Прикладываю код формы первого и основного приложения, который принимает по пайпу массив данных, и дополненный файл второго приложения (один из SDK), с которого и отправляются данные.
0
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
31.05.2019, 22:21 | 6 |
Ты перезаписываешь указатели, расположенные в
pReadData , соответственно pReadData[0] будет указывать куда-то не туда.Добавлено через 1 минуту Мне кажется, что эта команда возвращает не тот "размер данных", что ты хочешь. Добавлено через 2 минуты И записываешь ты что-то не то. Тебе нужно передавать и принимать именно данные, а не случайные указатели, которые на эти данные указывают.
0
|
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 142
|
||||||||||||||||
01.06.2019, 08:07 [ТС] | 7 | |||||||||||||||
Т.е. нужно перед записью создать двумерный массив, в который сперва закинуть данные с указателей, а потом передать их?
И то же самое здесь, только еще нужно добавить удаление памяти динамического массива в конце, правильно? Или как лучше это сделать? Она возвращает же все байты двумерного массива, разве нет? Теоретически, мне нужна лишь их половина (т.е. всего 2 канала из 4), тогда можно записать так, правильно? Или что не так?
0
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|||||||||||
01.06.2019, 09:23 | 8 | ||||||||||
Я думаю, что ты запутался в массивах.
В C++ двумерный массив можно создать вот так:
int pArr[5 * 5]; , а его размер - sizeof(ppArr) == 25 * sizeof(int) .В твоем же случае история другая:
int * , каждому из которых мы присваиваем какое-то значение. Массив указателей и блоки данных, на которые эти указатели указывают, скорее всего хаотично разбросаны по памяти. Ни о какой непрерывности тут уже речи не идет, да и sizeof(ppArr) == sizeof(int **) .Дело в том, что sizeof(...) возвращает размер типа, а не то, что ты себе придумал. В первом случае компилятор знает, что типом переменной является int[5][5], поэтому sizeof вернет 25*sizeof(int) . А вот во втором случае тип - int ** , и, соответственно, sizeof вернет sizeof(int**) .Добавлено через 2 минуты Да, будет. Пайп - это "трубка". Суешь с одного конца, забираешь из другого в том же порядке, в котором данные были отправлены. Нет, из-за того, что sizeof применяешь некорректно.
0
|
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 142
|
||||||||||||||||
01.06.2019, 11:42 [ТС] | 9 | |||||||||||||||
nonedark2008, я действительно немного запутался @_@
Получается, что sizeof лучше не применять к динамическому массиву. Тогда лучше действительно будет создать два новых массива (их размерность известна) и их уже передавать через пайп?
Или вот так будет правильнее, без создания дополнительных массивов:
Добавлено через 43 минуты upd для sizeof - так будет правильнее, я думаю:
0
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
||||||
01.06.2019, 11:50 | 10 | |||||
Типа того. Просто следи, указатель на какие данные и в каком объеме ты предаешь.
В твоем самом первом примере достаточно было сделать следующее:
1
|
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 142
|
|
01.06.2019, 12:04 [ТС] | 11 |
Спасибо! Я займусь этим позже, сперва я хотел просто реализовать передачу данных и проверить все на работоспособность (к сожалению, прибора нет под рукой, так что это можно будет сделать лишь на неделе), а потом уже заняться проверками и дальнейшим написанием программы : )
0
|
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 142
|
||||||
03.06.2019, 10:12 [ТС] | 12 | |||||
Коды поправил, но по каким-то причинам форма первого приложения, принимающего данные, после начала передачи данных просто зависает и ни на что не реагирует. С чем это может быть связано? (на данный момент я проверяю обновление данных label1 в форме)
0
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
03.06.2019, 11:54 | 13 |
Это легче всего проверить через отладчик: прервать выполнение всех потоков и посмотреть, кто что делает.
А зависает она скорее всего потому, что ты блокируешь поток обработки сообщений окна чтением данных из пайпа. Сообщения не обрабатываются - окно ни на что не реагирует. Продолжительные операции необходимо выполнять асинхронно. Как это сделать конкретно в Windows Forms я не знаю.
0
|
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 142
|
|
03.06.2019, 18:41 [ТС] | 14 |
nonedark2008, Хорошо, а такой вопрос - пайп может некоторые данные из пайпа не читать? К примеру, если я хочу из одного приложения с помощью цикла передавать одну и ту же обновляемую переменную (которую я буду там находить) и принимать её во втором также с помощью цикла, обрабатывать и выводить в форму, при этом возможно, что второй цикл будет работать медленнее. Будут ли данные теряться в таком случае?
0
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
03.06.2019, 22:16 | 15 |
У пайпа есть собственный буфер для данных. Если этот буфер заполнится, то операция записи в пайп будет заблокирована до тех пор, пока другая сторона эти данные не прочитает. Так что нет, данные теряться не будут, а скорость работы циклов будет автоматически синхронизироваться.
Если наоборот желательно, чтобы старые данные "терялись", то возможно стоит рассмотреть вариант с общей памятью, мьютексом для синхронизации доступа и ивентом для сигнализации об обновлении данных в общей памяти.
0
|
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 142
|
|||||||||||
05.06.2019, 21:06 [ТС] | 16 | ||||||||||
nonedark2008, понятно, спасибо, но все опять же сводится к тому, что обмен данными между приложениями через пайп препятствует обновлению метки в приложении-получателе. Проверял на работоспособность работу пайпа без бесконечных циклов, все работает, попытался выделить в отдельный поток обновление метки через backgroundworker и invoke - увы, проблема не исчезла. Сейчас подумываю над тем, чтобы второе приложение написать в более новой версии vs (старше, чем 2010), где можно воспользоваться библиотекой thread и с её помощью реализовать одновременную передачу данных через пайп и обновление label
Приложение-сервер:
0
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
06.06.2019, 00:28 | 17 |
Еще можно рассмотреть асинхронный ввод/вывод через пайпы. Ну и в Winapi, да и в Windows Forms есть свои примитивы для работы с потоками, так что можно обойтись и без std::thread.
0
|
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 142
|
|||||||||||
06.06.2019, 09:37 [ТС] | 18 | ||||||||||
nonedark2008, лол, нужно было лишь добавить
Но при этом я там же написал функцию Sleep, и теперь вот думаю, данные в таком случае не будут теряться из-за задержки, скажем в секунду? Может в каждой итерации цикла стоит запускать backgroundworker, в котором и будет
0
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
06.06.2019, 16:34 | 19 |
0
|
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 142
|
||||||
08.06.2019, 18:21 [ТС] | 20 | |||||
А как будет правильно запустить exe-файл другой программы через первую программу? В обработчик событий кнопки добавил данный код, взятый с msdn
0
|
08.06.2019, 18:21 | |
08.06.2019, 18:21 | |
Помогаю со студенческими работами здесь
20
Передача данных в виде структуры через ClientSocket Сохранение кнопок через буфер обмена Копирование файла через буфер обмена Одновременная передача и прием данных Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Блоги программистов | |||||
Обновление сайта www.historian.by
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
|
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
|
Модель полного двоичного суматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list):
s=^y]
p=x and y
for i in range(1,len(x)):
s. append((x^y)^p)
p=(x and y)or(p and (x or y))
return s
x=list()
y=list()
|
Это мы не проходили, это нам не задавали...(асихронный счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
|
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
|
Применение компонентов PrimeVue в Vue.js 3 на TypeScript
BasicMan 04.01.2025
Введение в PrimeVue и настройка окружения
PrimeVue представляет собой мощную библиотеку компонентов пользовательского интерфейса для Vue. js 3, которая предоставляет разработчикам богатый набор. . .
|
Как стать Senior developer
cpp_developer 04.01.2025
В современной индустрии разработки программного обеспечения позиция Senior Developer представляет собой не просто следующую ступень карьерной лестницы, а качественно новый уровень профессионального. . .
|
Что известно о дате выхода Windows 12 и чего от нее ждать
IT_Exp 04.01.2025
В мире технологий постоянно происходят изменения, и операционные системы не являются исключением. Windows 11, выпущенная в октябре 2021 года, принесла множество инноваций и улучшений, но. . .
|
Что новенького в .NET Core 9
Programming 04.01.2025
Обзор ключевых изменений в . NET Core 9
Платформа . NET Core продолжает активно развиваться, и версия 9 представляет собой значительный шаг вперед в эволюции этой технологии. Новый релиз. . .
|
Инструкция по установке python3.13.1 в Debian 12
AlexSky-coder 03.01.2025
sudo apt update
sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev
wget. . .
|
Затестил триггеры. архив проекта прилагаю с GOA файлами в настройках архиватора проектов.
Hrethgir 03.01.2025
В этот раз нет закольцованности, потому что от неё только глюки, как я понял, логика не вырезанная. Триггеры очень быстрые если верить измерениям с помощью анализатора от Gowin.
Есть ещё регистры,. . .
|
Python в помощь DevOps
IT_Exp 03.01.2025
Причины использования Python в работе DevOps
Python стал неотъемлемой частью мира DevOps, и это не случайно. Этот язык программирования обладает множеством преимуществ, которые делают его. . .
|