Моя модель программирования

Общие принципы, проектирование, модуляризация, темплейты и шаблоны
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Моя модель программирования

Сообщение Eugen Graf »

Вот немного хотел рассказать о том, какой модели программирования я придерживаюсь во всех своих проектах. Надеюсь на вашу конструктивную критику :super:

В начале открываются очереди и юзер ивенты. Юзер Ивент для главной Ивент Структуры регистрируется. Считываются установки программы из файла с установками. Параллельно ко всему этому запускаются все параллельные потоки.
После этого программа ждёт на какую кнопку нажмёт юзер. Если он нажимает например на кнопку Connect, то команда отправляется такому то потоку и т.д.
Если юзер нажимает на кнопку Exit, то эта команда отправляется всем параллельным потокам и главный поток так же выходит из цикла обработки ивентов. Как только все потоки закончили свою работу, все очереди и юзер ивенты закрываются и программа заканчивается.

Я думаю по скрину всё понятно, а если нет, то жду ваших вопросов.
Вложения
Pattern.png
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Моя модель программирования

Сообщение Eugen Graf »

А вот так выглядит мой Unified Cluster, который получают все параллельные потоки в моей программе. Общение между потоками идёт через очереди и юзер ивенты, находящиеся в этом кластере.
Вложения
Unified.png
Unified.png (3.25 КБ) 16049 просмотров
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Моя модель программирования

Сообщение Eugen Graf »

Названия всех параллельных потоков, использующих очередь в качестве метода коммуникации занесены в Enum Typedef. Такой же существует и для потоков, использующих юзер ивенты.
Вложения
QueuesTypedef.png
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Моя модель программирования

Сообщение Eugen Graf »

Если я хочу послать команду в параллельный поток, я просто выбираю из списка нужный поток и отправляю сообщение.
Вложения
Connect.png
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Моя модель программирования

Сообщение Eugen Graf »

Параллельный поток постоянно находится в режиме ожидания команд. Если приходит команда, то он её выполняет и возвращается обратно в режим ожидания.
Вложения
Open.png
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Моя модель программирования

Сообщение Eugen Graf »

Если потоку пришла команда на постоянное чтение порта например, то стартуется цикл считывания. Если во время считывания пришла новая команда, то цикл заканчивается и выполняет эту новую команду.
Вложения
Read.png
Read.png (8.32 КБ) 16042 просмотра
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Моя модель программирования

Сообщение Eugen Graf »

Открытие и закрытие очередей и юзер ивентов происходит таким образом.
Вложения
OpenRefnums.png
CloseRefnums.png
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Моя модель программирования

Сообщение Eugen Graf »

Вроде бы всё основное описал :super:

Описание метода коммуникации между потоками находится в этой теме:
/viewtopic.php?f=23&t=153

Жду критики и вопросов :D
Аватара пользователя
Konstantin Sumenko

Activity Bronze
expert
expert
Сообщения: 1439
Зарегистрирован: 17 июл 2008, 12:20
Награды: 2
Версия LabVIEW: 2010
Откуда: Moscow
Поблагодарили: 1 раз
Контактная информация:

Re: Моя модель программирования

Сообщение Konstantin Sumenko »

Все логично, я использую примерно такую же структуру. Queues+User Events. 1 поток под обработку событий, второй основной, в нем подпотоки (при работе с железом). Единственное, мне редко приходится использовать больше чем три очереди в программе.
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Моя модель программирования

Сообщение Eugen Graf »

Crowbar писал(а):Единственное, мне редко приходится использовать больше чем три очереди в программе.
Не понял, а сколько у тебя потоков в программе? Я так понимаю, что больше чем три. Тогда как ты передаёшь сообщения и данные из одного в другой?
Аватара пользователя
Konstantin Sumenko

Activity Bronze
expert
expert
Сообщения: 1439
Зарегистрирован: 17 июл 2008, 12:20
Награды: 2
Версия LabVIEW: 2010
Откуда: Moscow
Поблагодарили: 1 раз
Контактная информация:

Re: Моя модель программирования

Сообщение Konstantin Sumenko »

На верхний поток (который отвечает за Обработку событий)- User Event, на нижний очередь. На один прожорливый поток еще очередь. Далее я использую извращенную очередь на потоках, которые мало загружают систему или выполняются/отвечают редко. Это очередь, в которой помимо поля информации, содержится флаг (исходящий/входящий) и маркер целевого потока и набор специальных маркеров (для посылки команд одновременно всем потокам), соответсвенно выбор состояния машины проводится не через Dequeue element а через Preview Queue element, пока нужный поток его не вытащит, или если используется специальный маркер. Поэтому эта очередь может работать как псевдодуплексная для нескольких потоков. Тут есть проблемы, но иногда такой подход работает.
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Моя модель программирования

Сообщение Eugen Graf »

А, теперь понял. Preview Queue Element обо всём говорит.
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Моя модель программирования

Сообщение Eugen Graf »

Хотелось бы сделать свою универсальную библиотеку для этой модели:

Open Refnums
Close Refnums
Write Queue
Read Queue
Register User Event
Write User Event
Write Notifier
Read Notifier

Но вот какая проблема:
количество потоков в проектах разное. Если посмотреть внимательно на прибор Open Refnums, то видно что там используется Enum Typedef, со списком потоков. Как бы мне так сделать чтобы этот список передавался извне, а сам прибор не зависел бы от проекта и оставался универсальным для всех проектов. Тогда я поместил бы эту библиотеку в свой User.lib

Посоветуйте что нибудь, спс.

ЗЫ вот сделал как смог. Как использовать опишу позже.
Tasking.zip
LV 8.2
(89.71 КБ) 503 скачивания
Аватара пользователя
Konstantin Sumenko

Activity Bronze
expert
expert
Сообщения: 1439
Зарегистрирован: 17 июл 2008, 12:20
Награды: 2
Версия LabVIEW: 2010
Откуда: Moscow
Поблагодарили: 1 раз
Контактная информация:

Re: Моя модель программирования

Сообщение Konstantin Sumenko »

Кстати, а как ты работаешь с исключениями, вернее с кластером ошибки, я смотрю они у тебя в потоке (цикле while) заведены через туннелирование а не через shift регистры. Я так понимаю, ты отдельно смотришь только за ошибками протокольной части (где идет обмен данными через порты и т.п.)?
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Моя модель программирования

Сообщение Eugen Graf »

Да, я не вожу ошибку по сдвиг. регистру, я считаю что незачем. Если при выполнении какого либо прибора произойдёт ошибка, то последующие приборы не выполняются, в конце каждой итерации можно конечно разместить какой нибудь логгер ошибок, но в данном случае я этого не делаю. А вот зачем водить ошибку по кругу я вообще не понимаю.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Модели программирования»