Моя модель программирования
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Моя модель программирования
Вот немного хотел рассказать о том, какой модели программирования я придерживаюсь во всех своих проектах. Надеюсь на вашу конструктивную критику
В начале открываются очереди и юзер ивенты. Юзер Ивент для главной Ивент Структуры регистрируется. Считываются установки программы из файла с установками. Параллельно ко всему этому запускаются все параллельные потоки.
После этого программа ждёт на какую кнопку нажмёт юзер. Если он нажимает например на кнопку Connect, то команда отправляется такому то потоку и т.д.
Если юзер нажимает на кнопку Exit, то эта команда отправляется всем параллельным потокам и главный поток так же выходит из цикла обработки ивентов. Как только все потоки закончили свою работу, все очереди и юзер ивенты закрываются и программа заканчивается.
Я думаю по скрину всё понятно, а если нет, то жду ваших вопросов.
В начале открываются очереди и юзер ивенты. Юзер Ивент для главной Ивент Структуры регистрируется. Считываются установки программы из файла с установками. Параллельно ко всему этому запускаются все параллельные потоки.
После этого программа ждёт на какую кнопку нажмёт юзер. Если он нажимает например на кнопку Connect, то команда отправляется такому то потоку и т.д.
Если юзер нажимает на кнопку Exit, то эта команда отправляется всем параллельным потокам и главный поток так же выходит из цикла обработки ивентов. Как только все потоки закончили свою работу, все очереди и юзер ивенты закрываются и программа заканчивается.
Я думаю по скрину всё понятно, а если нет, то жду ваших вопросов.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Моя модель программирования
А вот так выглядит мой Unified Cluster, который получают все параллельные потоки в моей программе. Общение между потоками идёт через очереди и юзер ивенты, находящиеся в этом кластере.
- Вложения
-
- Unified.png (3.25 КБ) 16095 просмотров
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Моя модель программирования
Названия всех параллельных потоков, использующих очередь в качестве метода коммуникации занесены в Enum Typedef. Такой же существует и для потоков, использующих юзер ивенты.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Моя модель программирования
Если я хочу послать команду в параллельный поток, я просто выбираю из списка нужный поток и отправляю сообщение.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Моя модель программирования
Параллельный поток постоянно находится в режиме ожидания команд. Если приходит команда, то он её выполняет и возвращается обратно в режим ожидания.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Моя модель программирования
Если потоку пришла команда на постоянное чтение порта например, то стартуется цикл считывания. Если во время считывания пришла новая команда, то цикл заканчивается и выполняет эту новую команду.
- Вложения
-
- Read.png (8.32 КБ) 16088 просмотров
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Моя модель программирования
Открытие и закрытие очередей и юзер ивентов происходит таким образом.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Моя модель программирования
Вроде бы всё основное описал
Описание метода коммуникации между потоками находится в этой теме:
/viewtopic.php?f=23&t=153
Жду критики и вопросов
Описание метода коммуникации между потоками находится в этой теме:
/viewtopic.php?f=23&t=153
Жду критики и вопросов
-
Konstantin Sumenko
- expert
- Сообщения: 1439
- Зарегистрирован: 17 июл 2008, 12:20
- Награды: 2
- Версия LabVIEW: 2010
- Откуда: Moscow
- Поблагодарили: 1 раз
- Контактная информация:
Re: Моя модель программирования
Все логично, я использую примерно такую же структуру. Queues+User Events. 1 поток под обработку событий, второй основной, в нем подпотоки (при работе с железом). Единственное, мне редко приходится использовать больше чем три очереди в программе.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Моя модель программирования
Не понял, а сколько у тебя потоков в программе? Я так понимаю, что больше чем три. Тогда как ты передаёшь сообщения и данные из одного в другой?Crowbar писал(а):Единственное, мне редко приходится использовать больше чем три очереди в программе.
-
Konstantin Sumenko
- expert
- Сообщения: 1439
- Зарегистрирован: 17 июл 2008, 12:20
- Награды: 2
- Версия LabVIEW: 2010
- Откуда: Moscow
- Поблагодарили: 1 раз
- Контактная информация:
Re: Моя модель программирования
На верхний поток (который отвечает за Обработку событий)- User Event, на нижний очередь. На один прожорливый поток еще очередь. Далее я использую извращенную очередь на потоках, которые мало загружают систему или выполняются/отвечают редко. Это очередь, в которой помимо поля информации, содержится флаг (исходящий/входящий) и маркер целевого потока и набор специальных маркеров (для посылки команд одновременно всем потокам), соответсвенно выбор состояния машины проводится не через Dequeue element а через Preview Queue element, пока нужный поток его не вытащит, или если используется специальный маркер. Поэтому эта очередь может работать как псевдодуплексная для нескольких потоков. Тут есть проблемы, но иногда такой подход работает.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Моя модель программирования
Хотелось бы сделать свою универсальную библиотеку для этой модели:
Open Refnums
Close Refnums
Write Queue
Read Queue
Register User Event
Write User Event
Write Notifier
Read Notifier
Но вот какая проблема:
количество потоков в проектах разное. Если посмотреть внимательно на прибор Open Refnums, то видно что там используется Enum Typedef, со списком потоков. Как бы мне так сделать чтобы этот список передавался извне, а сам прибор не зависел бы от проекта и оставался универсальным для всех проектов. Тогда я поместил бы эту библиотеку в свой User.lib
Посоветуйте что нибудь, спс.
ЗЫ вот сделал как смог. Как использовать опишу позже.
Open Refnums
Close Refnums
Write Queue
Read Queue
Register User Event
Write User Event
Write Notifier
Read Notifier
Но вот какая проблема:
количество потоков в проектах разное. Если посмотреть внимательно на прибор Open Refnums, то видно что там используется Enum Typedef, со списком потоков. Как бы мне так сделать чтобы этот список передавался извне, а сам прибор не зависел бы от проекта и оставался универсальным для всех проектов. Тогда я поместил бы эту библиотеку в свой User.lib
Посоветуйте что нибудь, спс.
ЗЫ вот сделал как смог. Как использовать опишу позже.
-
Konstantin Sumenko
- expert
- Сообщения: 1439
- Зарегистрирован: 17 июл 2008, 12:20
- Награды: 2
- Версия LabVIEW: 2010
- Откуда: Moscow
- Поблагодарили: 1 раз
- Контактная информация:
Re: Моя модель программирования
Кстати, а как ты работаешь с исключениями, вернее с кластером ошибки, я смотрю они у тебя в потоке (цикле while) заведены через туннелирование а не через shift регистры. Я так понимаю, ты отдельно смотришь только за ошибками протокольной части (где идет обмен данными через порты и т.п.)?
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Моя модель программирования
Да, я не вожу ошибку по сдвиг. регистру, я считаю что незачем. Если при выполнении какого либо прибора произойдёт ошибка, то последующие приборы не выполняются, в конце каждой итерации можно конечно разместить какой нибудь логгер ошибок, но в данном случае я этого не делаю. А вот зачем водить ошибку по кругу я вообще не понимаю.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 7 Ответы
- 265 Просмотры
-
Последнее сообщение ujin1