Передача данных

  • Автор темы Sediment
  • Дата начала
S

Sediment

#1
Бьюсь над такой проблемой: запущены 2 программы на писанные на VB. Как осуществить передачу данных между ними без ADO?
И еще: как осуществить передачу данных между контролами на форме, если их >5 и нужен взиный обмен без использования RaiseEvents?
 

Over

Well-known member
04.07.2007
116
0
#2
Нужно использовать WinAPI. Передавать данные можно через маилслоты (mailslot). Подробные инструкции можно почитать в MSDN.
 
S

Sediment

#3
sax_ol
Первая программа каждые 20-50мс получает сигналы от сотни датчиков и направляет их во вторую программу, которая эти сигналы обрабатывает и результаты выдает в первую, которая выдает управляющие сигналы устройствам. Быстродействие нужно максимально возможное, чем файлы произвольного доступа (один "входной", другой "выходной"), не придумал. Та же проблема во второй программе, где около 20 специально разработанных контролов обмениваются данными. Здесь я кроме RaiseEvents тоже ничего не придумал, а это здорово тормозит.

Over
Честно говоря, за 10 лет, что я пишу программы на VB, первый раз услышал о майлслотах. Я понимаю, что, возможно, выгляжу полуграмотным, но самообразовываться некогда почти - начальство давит: "Давай программы! Да чтобы без ошибок!", так что "повышаю уровень" эпизодически.
 

Gamlet

Well-known member
08.01.2007
525
0
#4
Я еще могу подсказать:Через вин айпи или дерекс директ устрой сетевую связь, в качестве адресса укажи свой или "localhost" (лучши поставь определялку своего адресса). К сети он обращатся не будет, а пойдет по локалке. Скорость неплохая должна быть независимо от скорости сети. Тут есть лишние затраты системных ресурсов, но лучше ничего придумать не могу. :blink:
http://directx-vb.narod.ru-сайт по сетевой связи по дерекс директ.
 
S

skysun

#5
Есть несколько вариантов:

1)упомянутые файлы
2)mailslot, pipe.
3) winsocks - если объем данных небольшой и важно быстродействие работай через UDP
4) если правельно понял в твоем случае подойдет activeX.

а для связи между контролами внутри одного процесса организуй глобальный буффер!

к стати 2-ой вариан в конечном счете юзает tcp/ip - за счет этого возможно менее производителен

чем третий, но тут надо анализировать отсылаемые данные
 
S

Sediment

#7
Благодарю всех, кто старается мне помочь! Сейчас пробую различные варианты из предложеных вами.

skysun
Идея буфера очень привлекательна, но как реализовать использование буфера аналогично файлу произвольного доступа (чтение/запись данные в разные участки буфера разными контролами)? У меня контролы не только обмениваются данными между собой, но и с первой программой.
Идеальным вариантом было бы использование маленького кусочка оперативки (суммарный объем информации - меньше 3 килобайт), но так, чтобы другие программы на него не посягали. Как это сделать - не знаю.
Есть мысль использовать реестр, но никак не попробую.
 
P

Pasha

#8
<!--QuoteBegin-Sediment+19:12:2007, 20:46 -->
<span class="vbquote">(Sediment @ 19:12:2007, 20:46 )</span><!--QuoteEBegin-->Идея буфера очень привлекательна, но как реализовать использование буфера аналогично файлу произвольного доступа (чтение/запись данные в разные участки буфера разными контролами)?
[snapback]90660" rel="nofollow" target="_blank[/snapback]​
[/quote]Файлы, отображаемые в память: http://msdn2.microsoft.com/en-us/library/aa366551.aspx. Все остальные системы обмена данными работают через них, прямо или косвенно. Но почитай на всякий случай про пайпы и мэйлслоты.
 
S

skysun

#9
Файлы, отображаемые в память...
Это действительно решение! Или exe-activeX сервер, который будет предоставлять буффер клиентам. Или если объявить в dll переменую, как shared, то все процессы загрузившие эту dll будут использовать в памяти один и тот же адрес для хранения этой переменной.

Но оффициальным(рекомендуемым) и, по моему, самым надежным, способом является файл отображаемый на память. Есть еще одно "но". Эти файлы хороши если процессы работают на одном компе. Иначе лучше сетевые механизмы(pipe,mailslot,winsocks).