|
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
|
|
.NET 4.x Инструмент многопоточного программирования22.09.2015, 12:18. Показов 6641. Ответов 74
Метки нет (Все метки)
Программирование многопоточных приложений крайне непростое дело. Приходится обходить много подводных камней: учитывать гонки, взаимоблокировки и др. Специально для облегчения разработки программ создан инструмент, с помощью которого эти затруднения легко разрешимы. Инструмент представляет собой библиотеку классов, написанную на C# и включающую достаточное количество методов, позволяющих просто писать довольно сложные многопоточные приложения. Всем, кто интересуется созданием параллельных программ, эта библиотека классов способна в значительной степени облегчить написание кода.
Если будут какие-то вопросы, с удовольствием отвечу. А также буду весьма признателен за выявленные недостатки. Программное обеспечение исполняющей среды представлено классами пространства имен – BindingAndServisParallel. Полная документация, библиотека классов и пример хранятся: sites.google.com/site/algonauts/Home/fajly в файлах DocCoreParallel.docx, BindingAndServisCoreParallel_dll.dll, main.cs. Пример компилируется в среде Visual Studio 2010 Express на 64-х битной платформе. При компиляции проекта следует добавить ссылки: BindingAndServisCoreParallel_dll, PresentationCore, PresentationFramework, System, System.Xaml, WindowsBase Библиотеку классов BindingAndServisCoreParallel_dll версия сборки 0.0.0.1 можно использовать без ограничения в любых целях.
0
|
|
| 22.09.2015, 12:18 | |
|
Ответы с готовыми решениями:
74
Создание многопоточного приложения Оптимальная реализация многопоточного приложения Ведение лога для многопоточного приложения |
|
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
|
|||||||
| 22.10.2015, 11:19 | |||||||
0
|
|||||||
|
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
|
||||||||||||||||||||||||||||
| 22.10.2015, 12:37 [ТС] | ||||||||||||||||||||||||||||
|
Следующее, на что следует обратить внимание, - обмен сообщениями между юнитами. Сообщение напоминает почтовый обмен. У каждого юнита есть свой почтовый ящик. Разделение по отдельным ящикам больше для удобства и структуризации обмена. Почтовый ящик юнита не защищен, доступ свободен для всех юнитов системы. Каждый юнит может посылать письма любым другим юнитам, так и получать от них письма. Особенностью принятого обмена информацией является потокобезопасность и безотказность работы почтовой службы. Даже в условиях очень интенсивного обмена письмами, представьте, одновременно отсылаются десятки тысяч писем от сотен юнитов по разным адресам – гарантируется корректная доставка корреспонденции. Письмо не чистый лист бумаги, больше напоминает формуляр. Как и в обычном письме есть места обязательные для заполнения: адрес, кому, от кого, так и свободное поле, т.е само письмо; так и в сообщении есть обязательные для заполнения поля и поля для свободного обмена информацией. Формуляр представлен классом [CSHARP] Пользователь может заполнить только эту форму и закрепить ее за письмом, после этого письмо считается готовым к использованию. Шаблон подготовки и отправления письма выглядит так:
Поля письма заполняются не напрямую. Вначале нужно заполнить форму пользователя, представленную классом
Пользователь может заполнить только эту форму и закрепить ее за письмом, после этого письмо считается готовым к использованию. Шаблон подготовки и отправления письма выглядит так:
Вся процедура совершенно шаблонна. Подготовьте одно письмо, а для других писем меняйте значение полей. Следующий способ отправки письма – называется пакетная рассылка - более быстрый. Шаблон выглядит так:
Второй способ рассылки быстрее первого, особенно при пакетной рассылке. Почтовый обмен являются способом обмена информацией между юнитами. Юнит, заинтересованный в получении информации должен приостановить работу по команде ожидания письма
Добавлено через 3 минуты
0
|
||||||||||||||||||||||||||||
|
Master of Orion
|
|
| 22.10.2015, 12:41 | |
|
Dedoc, одно то, что в программе нет ни одного кастомного типа (зато есть 20 полей типа int/object) говорит о том, что вам еще есть чему учиться, прежде чем у вас получится написать достойную библиотечку такого масштаба.
0
|
|
|
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
|
|||||||
| 22.10.2015, 13:11 [ТС] | |||||||
|
Вот прежде чем писать ерунду, нелишне подумать, что формуляр является стандартной формой обмена между всеми юнитами. Каждый юнит должен точно знать тип информации и естественно применяется система общих типов. А для отдельного типа информации предусмотрено поле
0
|
|||||||
|
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
|
||
| 22.10.2015, 14:18 [ТС] | ||
|
Что касается TPL – библиотека общего плана, не уверен, что с ней будет проще работать.
0
|
||
|
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
|
||||||||||||||||||||||||||||||||
| 27.10.2015, 11:31 [ТС] | ||||||||||||||||||||||||||||||||
|
Шаблон № 2. Потокобезопасное выполнение методов из юнитов Юнит есть поток, поток может выполнять обращение к стороннему методу, т.е. методу определенному вне класса реализации потока. Если несколько юнитов одновременно обратятся к одному методу, может возникнуть конкурентная ситуация не распознаваемая операционной системой, что приведет к неправильному выполнению программы. Избежать этой ситуации можно с помощью методов класса RunMetod. В классе реализованы методы:
Пример:
Для чего нужно временное хранилище? В него записывается сам входной аргумент для временного хранения
Что делать, если требуется выполнить в потокобезопасном режиме посторонний метод, предположим, метод из сторонней библиотеки. Этот метод не обязательно должен соблюдать сигнатуру метода потокобезопасного режима? Такой метод следует обернуть методом с сигнатурой потокобезопасного режима и послать на исполнение. Пример:
Этот метод будет выполнен в потокобезопасном режиме методом класса RunMetod. Таким образом достигается универсальность в подходе к потокобезопасному программированию многопоточных приложений. Любые методы можно исполнять потокобезопасно, соблюдая лишь некоторые стандартные приемы. С помощью класса RunMetod, можно легко создавать многопоточные приложения со степенью надежности кода однопоточных программ.
0
|
||||||||||||||||||||||||||||||||
|
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 09.11.2015, 10:11 [ТС] | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
В связи с тем, что внесены серьезные коррективы в методы класса RunMetod, предыдущий пост следует считать утратившим значение. Вместо метода
Все методы класса относятся к одной из двух групп: методы с неограниченым количеством аргументов, приведенных к виду одного аргумента и методы с ограниченным количеством аргументов. 1) К первой группе относятся методы RunMetodSync и RunMetodAsync, имеющие сигнатуру вида
Первый аргумент – имя исполняемого синхронно или асинхронно пользовательского метода относящегося к типу Func<object,object>. Пользовательский метод должен принимать один аргумент типа object и возвращать значение того же типа. Второй аргумент методов первой группы – аргумент пользовательского метода типа object. Пример. Пусть требуется потокобезопасно выполнить метод задающий значение аргумента методу юнита F2.
Метод юнита F2 принимает аргумент object argument (первый по счету аргумент в списке определения метода, второй аргумент типа int зарезервирован для передачи, во время исполнения метода, номера юнита, третий аргумент – тип возвращаемого значения). Func<object ,int, object> Пусть этот аргумент типа object в упакованном виде представляет две переменные, для примера, как ссылки на исходный массив значений и обработанный массив значений: unSortedArray и sortedArray. Упакуем эти две ссылки и приведем к виду одного аргумента, так как все методы юнитов могут принимать только один аргумент типа object. Создадим массив из двух членов и инициализируем их значениями переменных.
В самом методе юнита должно быть обратное преобразование к исходному виду переменных. Пусть этот метод юнита имеет имя unitMetod2, тогда в самом начале этого метода должен располагаться код распаковки аргумента.
Метод RunMetodSync класса RunMetod имеет вид:
имя экземпляра класса, так как этим именем квалифицируется статический член класса units[myUnit]. units[myUnit] – член списка юнитов с номером myUnit. myUnit – номер юнита на котором в данный момент исполняется пользовательский метод F1, F2, или F3. Это значение передается исполнительной средой во время выполнения метода через зарезервированный в сигнатуре метода юнита аргумент int myUnit. unitRunMetod.RunMetodSync – метод RunMetodSync экземпляра класса RunMetod. SetArgumentToServerThread – первый аргумент метода RunMetodSync, представлен именем исполняемого потокобезопасно метода. endArgument – аргумент исполняемого потокобезопасно метода. Таким образом, имя метода и его аргумент передаются отдельно в качестве аргументов метода отвечающего за потокобезопасное исполнение заданного метода. 2) Методы второй группы класса RunMetod: Synchronous и Asynchronous позволяют потокобезопасно выполнять методы с ограниченным количеством аргументов, максимально – 16 и имеют более простой чем методы первой группы способ записи. Для примера вид метода с 16 аргументами.
Предыдущий пример, с использованием методов второго типа будет выглядеть следующим образом. Собственно входные аргументы самого метода юнита придется упаковать, так как сигнатура методов юнита допускает только один аргумент.
В качестве совета, при параллельном программировании с использованием библитеки классов BindingAndServiceCoreParallel, имеет смысл пользовательские методы изначально оформлять с требованием вида метода для класса RunMetod. Такие методы будут универсальными, их можно исполнять как в потокобезопасном режиме, так и обычным образом. Пример, метод считающий сумму аргументов
Пусть метод Summa расположен в месте, предоставляющем точку входа , допустим, в сторонней библиотеке. Потокобезопасный вызов метода должен осуществляться через потокобезопасный вызов оболочки этого метода.
0
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Master of Orion
|
||||||
| 09.11.2015, 10:43 | ||||||
0
|
||||||
|
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
|
||||||
| 09.11.2015, 11:13 [ТС] | ||||||
|
Максимум 16 входных аргументов. При вызове забудьте о прототипе, просто перечисляйте аргументы. Единственное ограничение – метод всегда возвращает тип object, к конкретному типу надо приводить самостоятельно.
0
|
||||||
|
0 / 0 / 0
Регистрация: 08.10.2015
Сообщений: 5
|
|
| 25.11.2015, 09:50 | |
|
В WPF присутствует возможность связывания данных. У вас замечательная система визуализации данных. А если потребуется, чтобы одно изменение в данных вызвало каскад изменений. Можно ли такое сделать в этой разработке?
0
|
|
|
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
|
|
| 27.11.2015, 10:17 | |
|
ну я тут темку почитал и мне кажется что это "достойный" наследник библиотеки FVMAS
![]() Dedoc, вы случаем с разработчиком FVMAS, Кольчуриным Юрием Сергеевичем, не консультировались? а то подход к написанию кода ну уж очень то похож эхх где мои 28 лет и почти 1300 страниц оффтопа по сабжу :-D на sql.ru я там знатно проржался в свое время, уж сколько там тролей выросло.... не перечесть
0
|
|
|
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
|
|
| 27.11.2015, 10:38 | |
|
ну это да... такой бред не каждый прочитать до конца может :-D
0
|
|
|
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
|
||
| 27.11.2015, 13:05 [ТС] | ||
|
Эта библиотека – комплекс классов для безопасного многопоточного программирования. На ее основе можно разрабатывать базы данных, классы позволяют реализовывать потокобезопасный доступ к источнику данных, но прямой реализации базы банных в библиотеке нет. Возможно со временем добавлю встроенную реализацию сетевой (не реляционной) базы данных.
0
|
||
| 27.11.2015, 16:51 | |
|
Не по теме:
0
|
|
|
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
|
|
| 27.11.2015, 18:32 | |
|
Одним словом - очередная велосипедная хрень , по сути и так все просто до невозможного в TPL.
П.С На архитектуру данной библиотеки вообще страшно смотреть.
0
|
|
| 27.11.2015, 18:32 | |
|
Паттерны многопоточного программирования Умножение матриц с использоанием многопоточного программирования Время многопоточного выполнения функции Разработка многопоточного приложения для обучения Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|