Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.01.2014, 19:29   #1
alexusankov
Пользователь
 
Регистрация: 04.01.2011
Сообщений: 66
По умолчанию c# - как сие реализовать? Нужно только мысли.

Здравствуйте. Извините за такое название темы, но думаю уже наверное, около недели, не хватает опыта в программировании. Код мне не нужен, подскажите, как это в принципе можно реализовать, и отсыпьте кейвордов для гугла, чтобы посвятиться
Собственно суть проста :
1.Имеется серверное приложение. Имеются ряд клиентских приложений. Пять штук. Подключаются к серверу, одновременно.
2. Приложение на сервере умеет захватывать com-port, и по rs232 общается с устройствами. Результат общения - массив чисел - 10 штук. Серверное приложение опрашивает необходимые устройства, для опроса необходим номер устройства.
3. Клиент, может подключиться к серверу и отдать ему номер необходимого устройства. После получения номера, сервер опрашивает устройство, и отдает клиенту результат.
4. Ситуация - при попытке одновременного обращения ДВУХ клиентов, сервер падает, т.к. для клиента создается экземпляр класса, в конструкторе которого захватывается порт ( SerialPort.Open() ). Что вполне и понятно, так и должно быть.
5. Как я вижу решение? Да никак не вижу. В голове сумбур из из частичного непонимания нового для меня языка.
Вопрос :
В какую сторону смотреть?
В своих смутных фантазиях могу предположить, что нужно создать статичный класс, и ммммм... к примеру создать ему 2 поля, типа :
static string[] Adress;
static strings[] Result;
И один метод, в котором я буду открывать порт, брать адрес из первого массива, и класть результат во второй массив (с доп. меткой).
Клиентский поток будет класть в первое поле адрес, запускать метод класса и искать результат во втором поле. Но по моему какая то ересь.
И как два потока будут работать с методом статик класса?
В общем, у кого есть какие мысли?
alexusankov вне форума Ответить с цитированием
Старый 02.01.2014, 19:35   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

отцепите ком порт от клиента, и всех делов
eval вне форума Ответить с цитированием
Старый 02.01.2014, 19:57   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Из всех потоков-экземпляров на сервере для каждого клиента убрать нафиг работу с COM-портом и вынести его в отдельный поток, работающий с глобальным буфером команд с маркером клиента (списки, динамические массивы, как душе угодно), принятых от каждого из клиентов, т.е. очередь.

Пришла команда от клиента, экземпляр сервера положил команду в буфер (очередь), а уже поток, обслуживающий COM-порт выгребает команды, выполняет с соответствующим таймаутом и возвращает ответ тому (для этого и маркеры) клиенту, от которого пришел запрос.

Надеюсь вы поняли, что экземпляр потока с COM-портом должен быть один?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 02.01.2014, 20:12   #4
alexusankov
Пользователь
 
Регистрация: 04.01.2011
Сообщений: 66
По умолчанию

Да, raxp, спасибо, непонятно только о "глобальном буфере", но в c# я так думаю прокатит static класс, с интефейсом, реализующим запись/чтение в List<> (это динамический массив).
Насколько я понял, попытаюсь сделать так :
1. Создаю "буфер" - это класс, с static методами SetData, GetData и Result.
2. Создаю новый поток, на старте приложения (!), который каждые 5 сек. запрашивает GetData и смотрит - не пустой ли буфер. Если есть адреса - обрабатывает их, и результат тоже кладет в буфер, используя Result(), и дополняя маркером.
3. На уровне самого буфера реализую "обновление данных", т.н. перезапись элемента при получении, если запись с таким маркером уже имеется.
Как это вижу :
Клиент цепляется, и открывается для него поток. Используя static класс, а именно метод SetData поток отдает в "буфер" адрес устройства.
Тем временем поток, который мы открыли на старте приложения, обнаруживает (каждые 5 сек смотрит) в буфере данные, обрабатывает из, и отдает в "буфер" результат с маркетом.
После отдачи адреса в "буфер" клиентский поток запрашивает от него результат со своим маркером.
Вопросы :
Могут ли два потока одновременно обратиться к static методу? Следит ли CLR за синхронизацией потока?
Что может произойти, если методом одновременно воспользуются два потока?
alexusankov вне форума Ответить с цитированием
Старый 02.01.2014, 20:30   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...пусть тот, кто уже пишет команды в глобальный буфер флаг выставляет, что занято место, а тот кто хочет записать - читает этот флаг. Занимается-ли этим CLR, бог его знает, пишу под другими языками.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 02.01.2014, 20:37   #6
alexusankov
Пользователь
 
Регистрация: 04.01.2011
Сообщений: 66
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
...пусть тот, кто уже пишет команды в глобальный буфер флаг выставляет, что занято место, а тот кто хочет записать - читает этот флаг.
Спасибо, но я думаю, быть может eval подскажет по потокам. Ваш вариант, для C# не выход, т.к. если два потока "просто так" не могут обратиться к одному объекту, то в реалиях сразу же возникнет ситуация, когда два потока попытаются считать флаг. Реализуемо конечно через костыли, но в c# я категорически против костылей.
Нужно просвятиться с потоками
alexusankov вне форума Ответить с цитированием
Старый 02.01.2014, 21:26   #7
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Вы конечно звиняйте, но работа с потоками на WinAPI едина. Покурите MSDN, те же костыли:
http://msdn.microsoft.com/ru-ru/libr...(v=vs.90).aspx
http://msdn.microsoft.com/ru-ru/libr...(v=vs.90).aspx
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 02.01.2014 в 21:28.
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно изменить скрипт, только как ??? usergeyv JavaScript, Ajax 0 09.07.2013 18:31
мне нужно только в h="" поместить определенное количество пробелов...но я не знаю как Тикки Общие вопросы C/C++ 3 12.05.2010 09:26
Silverlight - что сие такое? spamer Общие вопросы по программированию, компьютерный форум 16 21.11.2009 17:25
Одни из jpg файлов реальные JPEG а другие только название. как загрузиь только картинки? AgressiveBehavior Общие вопросы Delphi 1 16.09.2009 09:39