Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / WinForms, .Net Framework |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 3 вперед Ctrl→ все |
jenya7 Member Откуда: Сообщений: 1349 |
Я создал Solution - Tests. В Solution я создал несколько ConsoleApp - Test1, Test2, Test3. И я прогоняю их один за другим Test1.exe, Test2.exe, Test3.exe. Но мне нужен общий класс с глобальными объектами которые я мог бы передавать от Test1.exe к Test2.exe. Как это сделать? Сообщение было отредактировано: 7 мар 21, 15:52 |
7 мар 21, 15:59 [22290913] Ответить | Цитировать Сообщить модератору |
Roman Mejtes Member Откуда: г. Пермь Сообщений: 4159 |
если программы запускаются последовательно, то все объекты, которые будут созданы в Test1 будут удалены из памяти, когда она завершится и запустится Test2 То есть результаты надо сохранять в файл или перенаправить через console pipes в приложение Test2. |
7 мар 21, 16:14 [22290914] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
так это не результаты это объекты. я работаю с карточками, скажем 16 выходов (релей) подключенных по USB. производитель карточек дает dll для .Net я хочу инициализировать девайс в Test1 using IAHAL; //dll from IA IADevices iadevs = new IADevices(); IADevice REL1; IADevice REL2; void Init_3178() { IAError ec; bool rel1_ex = false; bool rel2_ex = false; ec = iadevs.DetectAllDevices(); if (ec != IAError.IA_OK) MessageBox.Show(iadevs.GetErrorMessage(ec)); if (iadevs.Devices.Count == 0) MessageBox.Show("No device found"); else { foreach (IADevice dev in iadevs) { //get the first device with DI functions if (dev.HasDigitalInput || dev.HasDigitalOutput) { // populate device rich box parent.Print_in_IADeviceListRichBox(dev.UniqueID+" Is Connected\n"); if (dev.UniqueID.Contains("01_IA_3178")) { REL1 = dev; relay_rel1 = 0; REL1.WriteDO(0); rel1_ex = true; } else if (dev.UniqueID.Contains("00_IA_3178")) { REL2 = dev; REL2.WriteDO(0); rel2_ex = true; } } } if (rel1_ex == false) { parent.Print_in_IADeviceListRichBox("IA 3178(REL1) is Missing \n"); System.Windows.MessageBox.Show("IA 3178 01 is Not Connected"); } if (rel2_ex == false) { parent.Print_in_IADeviceListRichBox("IA 3178(REL2) is Missing \n"); System.Windows.MessageBox.Show("IA 3178 00 is Not Connected"); } } } а включать-выключать реле в Test2 relay_mask |= (ulong)Math.Pow(2, relay_num - 1); iaErr = REL1.WriteDO(relay_mask ); тогда
IADevices iadevs = new IADevices();
IADevice REL1;
IADevice REL2;
должны быть глобальными для обеих. Сообщение было отредактировано: 7 мар 21, 16:28 |
||||
7 мар 21, 16:32 [22290919] Ответить | Цитировать Сообщить модератору |
Сон Веры Павловны Member Откуда: Сообщений: 6154 |
Ну синглтон же банальный. Если религия не позволяет сделать это в классическом виде, то DI в singleton scope. |
||||
7 мар 21, 20:31 [22290961] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
это как? засунуть объекты в dll и линковать его к каждому проекту? |
||||||||
7 мар 21, 20:36 [22290963] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4642 |
Ты скажи, что ты имеешь в виду под
А, впрочем, понял. Это тебе какой-нибудь IPC нужен. Сообщение было отредактировано: 7 мар 21, 20:37 |
||||||||
7 мар 21, 20:42 [22290966] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4642 |
Какой, к лешему, синглетон - у него ведь все по разным процессам (как я понял). |
||||||||
7 мар 21, 20:46 [22290968] Ответить | Цитировать Сообщить модератору |
Roman Mejtes Member Откуда: г. Пермь Сообщений: 4159 |
архитектуру нужно просто нормальную, а не это нечто идея делать 1 объект на 3 процесса, влечет за собой огромные проблемы с синхронизацией этого объекта, не между потоками, а между процессами. |
7 мар 21, 20:58 [22290970] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
а как сделать? Сообщение было отредактировано: 7 мар 21, 20:57 |
||||
7 мар 21, 21:04 [22290971] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
в принципе я из разных процессов обращаюсь к общим статическим объектам в рамках одного проекта. может то же самое можно делать и с несколькими проектами. |
||||||||
7 мар 21, 21:07 [22290972] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
|
||||
7 мар 21, 21:21 [22290976] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
ну если я инициализирую объект в одном процессе
IADevices iadevs = new IADevices();
я не могу передать указатель на него в другом? можно выделить какую нибудь область shared memory? |
||||||||
7 мар 21, 22:54 [22291001] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
Нет, не можешь. У каждого процесса своя память. Сериализуй свои объекты и передавай между процессами. Но для чего это тебе вообще нужно, пока неясно. |
7 мар 21, 23:42 [22291005] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4642 |
Ты колдун. |
||||
7 мар 21, 23:51 [22291008] Ответить | Цитировать Сообщить модератору |
Dima T Member Откуда: Сообщений: 15698 |
Может просто взять БД и там хранить "статические объекты" ? Тут SQLite хватит |
8 мар 21, 07:56 [22291032] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
а как это можно хранить в БД? объект
IADevices iadevs = new IADevices();
это девайсы подключенные по USB. я его инициализирую. нахожу подключенные карты. iadevs.DetectAllDevices(); и потом линкую к объекту этой карты IADevice REL1; IADevice REL2; foreach (IADevice dev in iadevs) { //get the first device with DI functions if (dev.HasDigitalInput || dev.HasDigitalOutput) { // populate device rich box parent.Print_in_IADeviceListRichBox(dev.UniqueID+" Is Connected\n"); if (dev.UniqueID.Contains("01_IA_3178")) { REL1 = dev; relay_rel1 = 0; REL1.WriteDO(0); rel1_ex = true; } else if (dev.UniqueID.Contains("00_IA_3178")) { REL2 = dev; REL2.WriteDO(0); rel2_ex = true; } } } и потом я с этим REL1 хочу работать в Test2.exe. Неужели это такая сложная задача? Может вынести объекты в глобальный dll или exe где они будут сохраняться? Сообщение было отредактировано: 8 мар 21, 09:58 |
||||
8 мар 21, 10:01 [22291046] Ответить | Цитировать Сообщить модератору |
Compositum Member Откуда: Санкт-Петербург Сообщений: 5967 |
А почему именно так? Ведь можно было бы создать один exe, в коде которого последовательно запускать задачи (экземпляры Task). Тогда и объект, содержащий данные, можно будет последовательно передавать из задачи в задачу без использования дополнительного шага предназначенного для хранения промежуточных данных (т.е. без создания файлов, без хранения в БД, без использования брокера сообщений). |
||||
8 мар 21, 10:24 [22291053] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
это устаревший подход. не гибкий. я взял парадигму - LabView + TestStand. В LabView пишуться модули (*.vi) а TestStand их прогоняет. завтра нужно прогнать другой сиквенс - поменял, добавил, убрал несколько *.vi и всё. решил реализовать тот же принцип в .Net. скажем есть модуль управления одной картой, есть модуль управления другой картой, и так далее комбинируя модули можно создавать разные сиквенсы. в LabView + TestStand это работает просто отлично. у меня это работает в .Net. есть менеджер который прогоняет мои модули (exe файлы). но есть моменты как например тот что я описал выше- чтоб включить-выключить одно реле мне каждый раз надо производить процесс инициализации девайсов, поиска карточек а я хочу сделать один раз инициализацию и потом включать-выключать выходы и опрашивать входы. Сообщение было отредактировано: 8 мар 21, 11:07 |
||||||||
8 мар 21, 11:06 [22291076] Ответить | Цитировать Сообщить модератору |
Dima T Member Откуда: Сообщений: 15698 |
Это противоречит устройству ОС. Объекты хранятся не в dll или exe, а в памяти процесса. Процессы максимально изолированы друг от друга чтобы сбой в одном никак не влиял на другой. У каждого процесса свое адресное пространство, там где у одного в памяти лежит объект А, у другого это место занято объектом В. Поэтому нельзя просто так передать объект из процесса в процесс. Если интересно как оно устроено - читай Рихтера Windows via C/C++. Там есть решения, но непростые, тут в двух словах не описать. Тут как вариант можешь сделать кучу DLL, которые подгружаются в один процесс. Тогда запускающий EXE создаст твои объекты и по очереди загрузит нужные DLL вызывая тесты в них с передачей общих объектов. |
||||
8 мар 21, 11:49 [22291089] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
Ну и пусть каждый модуль обращается к единому резидентному сервису, который хранит и удерживает все эти инициализированные классы. То есть непосредственным управлением внешним устройством должен заниматься выделенный (интеграционный, адаптер, драйвер) слой, все остальные (модули, плагины, компоненты) находятся на более высоком уровне абстракции и обращаются к этому сервису, а не общаются напрямую с устройством |
8 мар 21, 11:51 [22291090] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
а как реализовать практически? Сообщение было отредактировано: 8 мар 21, 12:05 |
||||
8 мар 21, 12:07 [22291098] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
у меня есть опция запустить exe не только как консоль но и визуально. некоторые тесты требуют итерации с оператором. с dll так не получится. |
||||||||
8 мар 21, 12:16 [22291100] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
Как написать свой сервис (службу), легко найти в интернете, тем более, это зависит от твоей среды разработки, которую ты не озвучил. Как провести границу абстрации между этим сервисом и компонентами - это твоя задача на хорошо подумать, только ты знаком со своей предметной областью. В идеале - это универсальный интерфейс, который принимает от компонента некую команду и передает её устройству. Если устройства слишком разные, может быть получится несколько разных интерфейсов. Так или иначе, служба не выставляет наружу какие-то классы, она принимает команды в каком-то виде (к примеру json), интерпретирует и отправляет нужному устройству. |
8 мар 21, 12:17 [22291101] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
Шо значит не озвучил cреду разработки - я об ней второй день говорю - .Net - C#. подключение к USB девайсу это настройка дескрипторов и эндпоинтов. я не особо силен в теории но полагаю что эти настройки можно как то сериализовать и передать, я просто не знаю как. скажем карточки подключенные по серийному порту (UART) с ними вообще проблем нет - порт открыл, порт закрыл, прямой доступ к COM порту из любого exe. если бы все сидели на UART (как это было до сих пор) и темы бы не возникло. Сообщение было отредактировано: 8 мар 21, 12:25 |
||||
8 мар 21, 12:32 [22291103] Ответить | Цитировать Сообщить модератору |
Compositum Member Откуда: Санкт-Петербург Сообщений: 5967 |
А в чём "не гибкость"?. Есть exe-приложение. У него есть подкаталог Extensions, в котором складываются DLL-файлы, в которых определены реализации конкретных задач. Состав и содержимое DLL-файлов может меняться со временем, путём их обновления/удаления/добавления новых. Т.е. если потребуется добавить новые задачи, то их можно собрать в виде дополнительного DLL-файла и поместить в этот подкаталог. EXE-приложение в процессе своей работы динамически загружает все DLL-файлы из каталога Extensions и смотрит, какие задачи в них реализованы. Дополнительно, рядом с EXE-файлом, находится конфигурационный файл (XML или JSON), описывающий, какие задачи и в каком порядке следует выполнять. По мере необходимости этот конфиг-файл редактируется. Я не настаиваю - делайте так, как сами посчитаете нужным. Сообщение было отредактировано: 8 мар 21, 12:41 |
||||
8 мар 21, 12:46 [22291107] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 3 вперед Ctrl→ все |
Все форумы / WinForms, .Net Framework | ![]() |