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

Тема в разделе "Visual Basic", создана пользователем Sediment, 2 дек 2007.

  1. Sediment

    Sediment Гость

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

    Over Well-Known Member

    Регистрация:
    4 июл 2007
    Сообщения:
    116
    Симпатии:
    0
    Нужно использовать WinAPI. Передавать данные можно через маилслоты (mailslot). Подробные инструкции можно почитать в MSDN.
     
  3. Sediment

    Sediment Гость

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

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

    Gamlet Well-Known Member

    Регистрация:
    8 янв 2007
    Сообщения:
    609
    Симпатии:
    0
    Я еще могу подсказать:Через вин айпи или дерекс директ устрой сетевую связь, в качестве адресса укажи свой или "localhost" (лучши поставь определялку своего адресса). К сети он обращатся не будет, а пойдет по локалке. Скорость неплохая должна быть независимо от скорости сети. Тут есть лишние затраты системных ресурсов, но лучше ничего придумать не могу. :blink:
    http://directx-vb.narod.ru-сайт по сетевой связи по дерекс директ.
     
  5. skysun

    skysun Гость

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

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

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

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

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Для: Sediment
    Вот в этой ТЕМЕ уже приводили множество вариантов обмена данными
     
  7. Sediment

    Sediment Гость

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

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

    Pasha Гость

    <!--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. Все остальные системы обмена данными работают через них, прямо или косвенно. Но почитай на всякий случай про пайпы и мэйлслоты.
     
  9. skysun

    skysun Гость

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

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

Поделиться этой страницей