Вверх ↑
Этот топик читают: Гость
Ответов: 655
Рейтинг: 18
#1: 2017-02-26 18:12:17 ЛС | профиль | цитата
Добрый день.

Как правильно организовать потоки чтения и записи SharedMemory для 2х приложений?
Правильно ли использовать такой вариант?

Add(MainForm,11514487,35,112)
{
Width=496
Height=499
link(onCreate,10085504:start,[])
}
Add(Memo,8129461,308,126)
{
Left=230
Top=20
Width=220
Height=410
ScrollBars=2
}
Add(Button,2057548,35,154)
{
Left=10
Top=45
link(onClick,12121531:doNext,[])
}
Add(MultiElementEx,10085504,238,126)
{
link(data,8129461:doAdd,[])
}
BEGIN_SDK
Add(EditMultiEx,16326354,21,21)
{
WorkCount=#5:start|4:send|
EventCount=#4:data|
Width=860
Height=312
link(start,13656572:doEvent1,[])
link(send,10377767:doEvent1,[(73,34)(73,188)])
}
Add(SharedStream,4363001,672,21)
{
CoreName="ttt"
PageMem=4
}
Add(DataToFile,11739912,672,175)
{
Type=5
Point(doPosition)
Point(Position)
link(onGet,16326354:data,[(835,181)(835,27)])
link(Stream,4363001:Stream,[])
}
Add(Hub,13656572,84,21)
{
OutCount=3
link(onEvent1,4363001:doOpen,[])
link(onEvent2,5590172:doCreate,[])
link(onEvent3,11026675:doWork1,[(139,41)])
}
Add(Events,5590172,272,28)
{
Name="evt"
ManualReset=1
}
Add(WaitObject,7750916,272,74)
{
link(ObjHandle,5590172:ObjHandle,[])
}
Add(LineBreak,7191655,177,35)
{
Caption="set"
link(Out,5590172:doSet,[])
Primary=[9987842,198,168]
}
Add(LineBreak,5328045,588,175)
{
Caption="wr"
link(Out,11739912:doPut,[])
Primary=[9886294,-175,21]
}
Add(LineBreak,10244397,626,182)
{
Caption="re"
link(Out,11739912:doGet,[])
Primary=[10941797,-273,-59]
}
Add(Hub,12477375,245,189)
{
OutCount=5
link(onEvent1,14927464:doWork2,[])
link(onEvent2,9886294:In,[])
link(onEvent3,9987842:In,[])
link(onEvent4,11108952:In,[])
link(onEvent5,16442165:In,[])
}
Add(SafeMode,16210678,183,189)
{
Name="123"
Mode=0
link(onSafeMode,12477375:doEvent1,[])
}
Add(LineBreak,13629282,214,42)
{
Caption="reset"
link(Out,5590172:doReset,[])
Primary=[11108952,108,168]
}
Add(HubEx,14927464,462,189)
{
link(onEvent,12573079:doData,[])
}
Add(SafeMode,12832853,273,116)
{
Name="123"
Mode=0
link(onSafeMode,4563249:doEvent1,[])
}
Add(LineBreak,3790066,91,74)
{
Caption="start"
link(Out,11026675:doWork2,[])
Primary=[16442165,196,143]
}
Add(Hub,4563249,328,116)
{
link(onEvent1,14927464:doWork1,[(466,122)])
link(onEvent2,10941797:In,[])
}
Add(DoData,12573079,483,189)
{
Data=Integer(0)
link(onEventData,11739912:doPosition,[])
}
Add(Thread,11430267,180,74)
{
link(onExec,7750916:doWait,[])
link(onSyncExec,12832853:doSafeMode,[(242,87)(242,122)])
}
Add(Hub,10377767,112,182)
{
link(onEvent1,11430267:doStop,[(139,188)(139,87)])
link(onEvent2,16210678:doSafeMode,[])
}
Add(HubEx,11026675,135,74)
{
link(onEvent,11430267:doStart,[])
}
END_SDK
Add(CounterEx,12121531,105,154)
{
link(onNext,10085504:send,[(187,160)(187,139)])
}


Редактировалось 1 раз(а), последний 2017-02-26 18:12:45
карма: 0

0
Разработчик
Ответов: 26155
Рейтинг: 2127
#2: 2017-02-27 10:25:41 ЛС | профиль | цитата
Gunnman писал(а):
Как правильно организовать потоки чтения и записи SharedMemory для 2х приложений?

Я вообще не понял, зачем это надо? Два приложения и так работают в разных потоках. В твоей схеме, SaveMode стоит в двух местах, работающих в одном обработчике, тк onSyncExec потока работает в том же обработчике, что и главное окно. Смысла от такого применения нет никакого. А первую схему я вообще не помню для чего делал. Нет ли ссылки на топик, где она приводилась. Похоже на то, что поток там стоит только для того, чтобы не тормозить главное окно при ожидании глобального события. И если та схема работает, то зачем что-то изобретать новое?

Редактировалось 1 раз(а), последний 2017-02-27 10:29:36
карма: 22

0
Ответов: 4630
Рейтинг: 749
#3: 2017-02-27 12:54:28 ЛС | профиль | цитата
Какая задача стоит? Обмен данными между двумя приложениями?
карма: 26

0
Ответов: 655
Рейтинг: 18
#4: 2017-02-27 18:58:42 ЛС | профиль | цитата
nesco писал(а):
Gunnman писал(а):
Нет ли ссылки на топик, где она приводилась.

http://forum.hiasm.com/topic/64755/6

--- Добавлено в 2017-02-27 19:05:04

Netspirit писал(а):
Какая задача стоит? Обмен данными между двумя приложениями?


Задача обмениваться данными между приложениями, изначально думал о TCP\UDP но тут тоже не все так просто:
1) Нужен учет соединений
2) Нужна аутентификация приложений (чтобы понимать что именно наше ПО подключилось к порту)
3) Нужно делать буфер для приема данных

Ищу вариант двустороннего обмена, пытаюсь понять нужно ли делать блокировку ресурса при чтении\записи из разных процессов.

Редактировалось 1 раз(а), последний 2017-02-27 19:05:04
карма: 0

0
Ответов: 4630
Рейтинг: 749
#5: 2017-02-27 19:08:36 ЛС | профиль | цитата
Gunnman писал(а):
изначально думал о TCP\UDP
Я сейчас в процессе работы над сервером и клиентом на основе pipe.
Gunnman писал(а):
Нужна аутентификация приложений
Надо делать протокол.
Gunnman писал(а):
Нужно делать буфер для приема данных
Нужно. DataAccumulator может помочь.
карма: 26

0
Ответов: 655
Рейтинг: 18
#6: 2017-02-27 19:11:54 ЛС | профиль | цитата
Netspirit, pipe это как раз для обмена данными?
карма: 0

0
Ответов: 2059
Рейтинг: 132
#7: 2017-02-27 20:21:20 ЛС | профиль | цитата
Gunnman писал(а):
pipe это как раз для обмена данными?

Да.
http://forum.hiasm.com/topic/65677
В архиве схема с двумя различными примерами передачи данных между приложениями.

Редактировалось 1 раз(а), последний 2017-02-27 20:22:17
карма: 6

0
Ответов: 655
Рейтинг: 18
#8: 2017-02-27 20:25:42 ЛС | профиль | цитата
flint2, я скачивал этот архив, но не совсем понял принцип работы. Не могли бы вы объяснить как передать данные от одного приложения к другому с помощью данного компонента? В архиве пример обработки строк...
карма: 0

0
Ответов: 2059
Рейтинг: 132
#9: 2017-02-27 20:43:02 ЛС | профиль | цитата
Сейчас надо подумать, как изложить.
Скоро отпишусь.

------------------------
Здесь реализован простой вариант, без именованных каналов.
http://www.frolov-lib.ru/books/bsp/v27/ch2_3.htm
Работает так:
Приложение, с которым происходит обмен, должно уметь не только вести обмен с консолью, или файлом, но и обмениваться через каналы In и Out.
Как правило все консольные(и не только) приложения это умеют.
В командной строке обычно указывается -i (канал ввода) и -o(канал вывода).
Один из параметров может быть файлом.
1. вариант.
На точку FileName подаем имя файла с которым будим обмениваться, в командной строке указываем -i, это значит, что мы будем передавать данные.
Пишем какие-то ключи, и в той-же командной строке пишем -o, это значит, что мы будем принимать данные.
Например mystem -n -i -g -e cp1251 - в данном примере нет -o, по умолчанию, если получатель не указан, то всё выводится в канал OUT.
На точку doIN подаём данные, которые передаём приложению. Данные могут быть любыми, короче, какие нам нужно передать.
С точки onOUT принимаем данные, то-есть точка onOUT это выход данных приложения.
Собственно получается что наша программа является терминалом.
Чего-то пишем, дочерние приложение чего-то делает и отвечает нам.
2. вариант.
Всё то-же самое, только не мы передаём данные, а они берутся из файла(в примере *.fb2), а ответ получаем мы, в виде текстового файла.
3. вариант.
Всё то-же самое, только мы передаём данные, а в качестве получателя, или файл, или терминал, или ...

Вроде бы всё.

Редактировалось 1 раз(а), последний 2017-02-27 21:41:26
карма: 6

0
Ответов: 655
Рейтинг: 18
#10: 2017-02-27 21:45:12 ЛС | профиль | цитата
flint2, понял! буду пробовать, спасибо!

--- Добавлено в 2017-02-27 21:51:18

flint2, а в своей программе можно организовать каналы? Для обмена между процессами созданными в hiasm?

Редактировалось 1 раз(а), последний 2017-02-27 21:51:18
карма: 0

0
Ответов: 2059
Рейтинг: 132
#11: 2017-02-27 22:07:18 ЛС | профиль | цитата
В IC легко, а так на вскидку не помню, есть нужные компоненты, или нет не могу сказать.
Я завтра попробую заняться и доработаю этот компонент.
Собственно нужен разбор входной строки, по моему что-то есть такое.
+ надо сделать отдельную точку для закрытия каналов.

Редактировалось 3 раз(а), последний 2017-02-27 22:19:59
карма: 6

0
Ответов: 4630
Рейтинг: 749
#12: 2017-02-28 12:37:41 ЛС | профиль | цитата
Gunnman писал(а):
а в своей программе можно организовать каналы?
Каналы (например, используемые в консольных приложениях) - это и есть pipes. Из существующих компонентов можно использовать MailSlot_Server/MailSlot_Client или DDEServer/DDEClient, но там может быть недостаточно функционала.
карма: 26

0
Разработчик
Ответов: 26155
Рейтинг: 2127
#13: 2017-02-28 19:06:42 ЛС | профиль | цитата
Netspirit писал(а):
DDEServer/DDEClient, но там может быть недостаточно функционала.

А чего конкретно там не хватает? Ну нет там принудительного дисконнекта клиентов, над этим можно подумать. Но вот задача пока что не совсем ясна -- че за данные будут передаваться и как вообще собираются осуществлять обмен -- клиент -> сервер или клиент -> сервер -> клиент?
карма: 22

0
Ответов: 655
Рейтинг: 18
#14: 2017-02-28 19:58:53 ЛС | профиль | цитата
nesco писал(а):
че за данные будут передаваться и как вообще собираются осуществлять обмен


Данные типа string, обмен двусторонний сервер может посылать данные клиенту и клиент может посылать данные серверу.
карма: 0

0
Разработчик
Ответов: 26155
Рейтинг: 2127
#15: 2017-03-02 00:04:53 ЛС | профиль | цитата
Пример организации сессионного клиент-серверного DDE-обмена. Те имитатор создает некое количество клиентов с разными именами. При активации клиента, на сервере для него создается своя сессия обмена. При отсоединении клиента, автоматически анулируется и его сессия обмена на сервере. Авторизация, конечно, слабенькая, но показан только принцип, все зависит от конкретной реализации. Компоненты DDEServer и DDEClient необходимо обновить с SVN, пришлось добавить возможность отключения автоматического коннекта с сервером для DDEClient-a

Редактировалось 1 раз(а), последний 2017-03-02 00:06:24
карма: 22

1
файлы: 2DDE_Server_001.rar [2.8KB] [399], DDE_Client_001.rar [1.9KB] [398]
Голосовали:Gunnman
Сообщение
...
Прикрепленные файлы
(файлы не залиты)