Вверх ↑
Этот топик читают: Гость
Ответов: 1343
Рейтинг: 31
#1: 2016-01-06 02:26:31 ЛС | профиль | цитата
Задумался, как можно на максимум упростить общение 2-х и более программ (особенность в том что хотелось сделать что то типо внешних модулей для обработки данных, как в контейнер подаём, забираем данные, но при этом надо не нагружать текущую программу с которой подаются и принимаются данные. DLL не подходит, если в ней произойдёт критическая ошибка, то краш всего что есть. Может уже есть что то такое интересное, которое может работать как контейнер в схеме и при этом после запуска основной программы контейнер будет работать в отдельном процессе, после чего, при критических ошибках можно будет перезапустить этот модуль без перезагрузки основной программы)

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

придумал вот так:

code_36748.txt

Только проблема есть в том что данные передаваемые через это дело могут содержать Разделитель который учавствует в разложении и образовании МТ потока
карма: 2

0
файлы: 1code_36748.txt [1.2KB] [262]
Ответов: 2059
Рейтинг: 132
#2: 2016-01-06 12:16:45 ЛС | профиль | цитата
Rysik,
Если использовать anonymous pipes для прокладки труб StdIn/StdOut к дочернему процессу? ...или именованные, только мне кажется, что с именованными более громоздко получится. В общем перенаправлять каналы ввода вывода.
Правда IC надо рисовать.
после чего, при критических ошибках можно будет перезапустить этот модуль

Если задействовать третью трубу - StdError, то и перезапускать наверное не надо будет.
Пайп в Windows - это просто один из методов коммуникации между процессами. "Пайп - это коммуникационный шлюз с двумя концами; некий процесс через дескриптор (handle) на одном конце пайпа может передавать данные другому процессу, находящемуся на другом конце пайпа."
карма: 6

0
Ответов: 1926
Рейтинг: 172
#3: 2016-01-06 22:35:53 ЛС | профиль | цитата
Rysik писал(а):
Только проблема есть в том что данные передаваемые через это дело могут содержать Разделитель который учавствует в разложении и образовании МТ потока


Используй в качестве разделителя табуляцию:
Add(MT_String,1513799,637,252)
{
Delimeter="\9"
}

Или можно использовать эти компоненты вместо MT:
Add(StreamPack,13821500,294,427)
{
}
Add(StreamUnPack,15235041,357,427)
{
}

StreamPack
StreamUnPack
карма: 9
1
Голосовали:Rysik
Ответов: 1343
Рейтинг: 31
#4: 2016-01-06 22:47:35 ЛС | профиль | цитата
3042 писал(а):
Или можно использовать эти компоненты


Точно, можно же использовать другие типы данных
------------ Дoбавленo в 22.11:
Рузальтат:

Add(MainForm,6014153,105,119)
{
link(onCreate,15033339:doCreate,[(215,139)(215,279)])
}
Add(MailSlot_Server,15033339,294,273)
{
Name="1"
link(onRead,4730863:doMT,[])
}
Add(MailSlot_Client,5031519,567,168)
{
Name="1"
}
Add(Button,7160093,273,70)
{
Left=25
Top=20
Data=String(ui)
link(onClick,11613706:doRandom,[])
}
Add(Button,6529846,273,112)
{
Left=25
Top=45
Data=String(ji)
link(onClick,14292751:doRandom,[])
}
Add(ChanelToIndex,12705546,413,70)
{
Point(Data)
link(onIndex,12860559:doEvent1,[])
}
Add(IndexToChanel,9755057,455,357)
{
Point(Data)
link(onEvent1,9744363:doText,[])
link(onEvent2,16468316:doText,[(513,370)(513,405)])
link(Data,13608578:Value,[])
}
Add(MT_AddData,6582212,462,168)
{
InputMT=0
link(onAdd,1513799:doStr,[])
link(Data2,8947475:Value,[])
}
Add(MT_MultiMem,9636868,399,266)
{
link(onData,13104429:doEvent1,[])
}
Add(Random,11613706,322,70)
{
link(onRandom,12705546:doWork1,[])
}
Add(Random,14292751,322,112)
{
link(onRandom,12705546:doWork2,[(373,118)(373,83)])
}
Add(MT_String,1513799,518,168)
{
link(onResult,5031519:doWrite,[])
}
Add(MT_String,4730863,350,266)
{
link(onResult,9636868:doValue,[])
}
Add(Edit,9744363,539,357)
{
Left=120
Top=20
}
Add(Edit,16468316,539,399)
{
Left=120
Top=45
}
Add(StreamConvertor,316012,413,119)
{
Mode=2
link(onResult,8947475:doValue,[])
link(Data,12705546:Data,[])
}
Add(StreamConvertor,5900559,406,315)
{
Mode=3
link(onResult,13608578:doValue,[])
link(Data,9636868:Value2,[])
}
Add(Memory,13608578,455,315)
{
}
Add(Memory,8947475,469,119)
{
}
Add(Hub,12860559,455,70)
{
link(onEvent1,316012:doConvert,[(486,76)(486,111)(401,111)(401,125)])
link(onEvent2,6582212:doAdd,[(480,83)(480,106)(390,106)(390,174)])
}
Add(Hub,13104429,441,266)
{
link(onEvent1,5900559:doConvert,[(475,272)(475,310)(394,310)(394,321)])
link(onEvent2,9755057:doEvent,[(471,279)(471,305)(390,305)(390,363)])
}
карма: 2

0
4
Сообщение
...
Прикрепленные файлы
(файлы не залиты)