Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.84/32: Рейтинг темы: голосов - 32, средняя оценка - 4.84
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
.NET 4.x

Инструмент многопоточного программирования

22.09.2015, 12:18. Показов 6225. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.09.2015, 12:18
Ответы с готовыми решениями:

Создание многопоточного приложения
Делаю многопоточное приложение. Смысл в том, что в главном потоке надо изменять внутреннее состояние классов, которые выполняются в других...

Оптимальная реализация многопоточного приложения
Несколько простоватая проблема. Есть приложение, в нём пользователь запускает длительный процесс, и нужно, чтобы была возможность...

Ведение лога для многопоточного приложения
Всем привет! Задача состоит вот в чем: Создаются потоки, выполняющие какие то операции(сейчас это не важно). На главной форме есть...

74
22.09.2015, 14:29

Не по теме:

где тут кнопка дислайк

0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18280 / 14203 / 5368
Регистрация: 17.03.2014
Сообщений: 28,883
Записей в блоге: 1
22.09.2015, 23:31
Dedoc, что именно эта библиотека помогает делать? Есть ли примеры когда использование данной библиотеки будет удобнее чем TPL или обычные потоки? Зачем в библиотеке предназначенной для многопоточного программрования зависимость от WPF? Как насчет приложений на Windows Forms или ASP.NET?
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
23.09.2015, 09:25
Dedoc, почему в названии библиотеки присутствует BindingAndServisCoreParallel_dll?
Servis - это какое-то новое слово? В инете полно переводчиков. Ладно в коде ошибиться в слове, ну это же название библиотеки .
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
23.09.2015, 09:26
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Зачем в библиотеке предназначенной для многопоточного программрования зависимость от WPF?
Вот зачем:
Название: Screenshot_6.jpg
Просмотров: 294

Размер: 55.8 Кб
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
23.09.2015, 09:40
ExtendetDataGrid

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
using System.Windows.Controls;
namespace BindingAndServisParallel
{
    public static class ExtendetDataGrid
    {
        public static void AddColumn(this DataGrid_CP dg, string name)
        {
            DataGridBoundColumn column = new DataGridTextColumn();
            DataGrid_CP.Column_CP column_CP = new DataGrid_CP.Column_CP();
            column_CP.column = column;
            column_CP.name = name;
            dg.listColumn.Add(column_CP);
            dg.MakeDataGrid_CP();
        }
        public static void AddRow(this DataGrid_CP dg, string data)
        {
            int count = dg.listColumn.Count;
            if (count == 1)
            {
                dg.mdg.Column1 = data;
                dg.md1.Add1(dg.mdg);
            }
        }
    }
}
Чёт я не пойму, где там помощь с многопоточностью (бегло глянул декмпиленный набор классов в библиотеке)?

Добавлено через 8 минут
Хотя глянул доки, там много всего, неохота разбираться. Лучше бы автор тут написал простой пример и показал в чём суть, в чём поможет эта библиотека. На конкретном маленьком примере.
0
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
23.09.2015, 14:10  [ТС]
OwenGlendower
что именно эта библиотека помогает делать?
Создавать многопоточные приложения. Основная трудность параллельного программирования, как ни покажется странным, заключается в том что код выполняется действительно параллельно на разных физических ядрах процессора. Покажу на примере. Пусть есть метод, накапливающий сумму входного аргумента.

void Summa(int arg) { static int X; X=X+arg;}

Каким будет значение X, если этот метод вызовут два потока каждый 50 раз и значение arg=1?
Знатоки арифметики не задумываясь скажут – 100. Знатоки многопоточности – “ неизвестно”, - и этот будет правильным ответом. Значение X может быть и 100, и 99, и 98…, как придется. Подобный результат, вообще говоря, приговор для многопоточного программирования, часть информации теряется. Чтобы этого не происходило, прибегают к различным способам синхронизации потоков. Библиотека предоставляет класс RunMetod, гарантирующий правильную работу программы. Все что нужно, это оформить пользовательский метод в потокобезопасном варианте и вызывать его из любого количества потоков, результат всегда будет правильный.
Из рабочих потоков невозможно обращаться к элементам управления, открывать окна, таблицы и т.д. Библиотека содержит механизм такого доступа посредством встроенного юнита SystemMailUnit. Все что нужно – сформировать письмо (естественно ,из рабочего потока), прикрепить к нему метод требующий обращения к элементу управления и отослать письмо юниту SystemMailUnit. Таким образом, из нескольких потоков можно работать с одной экранной формой.


Есть ли примеры когда использование данной библиотеки будет удобнее чем TPL или обычные потоки?Примеров нет, работа с TPL и обычными потоками не конструирование многопоточной программы. Это примерно как знание алфавита и писательское творчество, большая дистанция.

Зачем в библиотеке предназначенной для многопоточного программирования зависимость от WPF? Как насчет приложений на Windows Forms или ASP.NET?
Зависимости от WPF нет, в библиотеке действительно используются классы платформы WPF, пример написан с использованием WPF, но это не должно помешать применению в программах использующих другие платформы.

Casper-SC
Dedoc, почему в названии библиотеки присутствует BindingAndServisCoreParallel_dll?
Servis - это какое-то новое слово? В инете полно переводчиков. Ладно в коде ошибиться в слове, ну это же название библиотеки


Автор от силы знает пару дюжин английских слов, половину из которых он пишет с ошибками. Эта проблема автору известна, постараюсь исправить название, если получится.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.09.2015, 15:25
Цитата Сообщение от Dedoc Посмотреть сообщение
Примеров нет, работа с TPL и обычными потоками не конструирование многопоточной программы. Это примерно как знание алфавита и писательское творчество, большая дистанция.
TPL/PLINQ вполне позволяют не париться и писать
C#
1
int result = arr.AsParallel().Sum(); // вернет 100
Покажите проблему, которая возникает при многопоточном программировании, и как ваша библиотека её решает. Желательно показать преимущество над имеющимися средствами. Потому что всё это звучит красиво и всё такое, но как говорил известный пингвин: Talk is cheap, show me the code.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18280 / 14203 / 5368
Регистрация: 17.03.2014
Сообщений: 28,883
Записей в блоге: 1
23.09.2015, 20:34
Цитата Сообщение от Dedoc Посмотреть сообщение
Основная трудность параллельного программирования, как ни покажется странным, заключается в том что код выполняется действительно параллельно на разных физических ядрах процессора.
Основная трудность в том что они имеют равный доступ к общей памяти. Если алгоритм можно распаралелить так чтобы каждый поток работал только со своими данными, то количество проблем резко уменьшается.

Цитата Сообщение от Dedoc Посмотреть сообщение
Пусть есть метод, накапливающий сумму входного аргумента.
void Summa(int arg) { static int X; X=X+arg;}
Этот пример в C# не откомпилируется

Цитата Сообщение от Dedoc Посмотреть сообщение
Библиотека предоставляет класс RunMetod, гарантирующий правильную работу программы. Все что нужно, это оформить пользовательский метод в потокобезопасном варианте и вызывать его из любого количества потоков, результат всегда будет правильный.
Если метод сделать потокобезопасным, то я не понимаю зачем мне метод RunMetod.

Цитата Сообщение от Dedoc Посмотреть сообщение
Из рабочих потоков невозможно обращаться к элементам управления, открывать окна, таблицы и т.д.
Еще как возможно. Класс Dispatcher в WPF и метод Invoke в Windows Forms справляются со своей задачей. Возможно (возможно!) они не очень удобные и их можно улучшить, но утверждение о невозможности обращения к UI элементам из потоков не соответствует действительности.

Цитата Сообщение от Dedoc Посмотреть сообщение
Библиотека содержит механизм такого доступа посредством встроенного юнита SystemMailUnit. Все что нужно – сформировать письмо (естественно ,из рабочего потока), прикрепить к нему метод требующий обращения к элементу управления и отослать письмо юниту SystemMailUnit.
Не поверишь - Dispatcher.BeginInvoke делает ровно то же самое. Сам же механизм юнитов похож на реализацию идеи обмена сообщениями между отдельными частями приложения. И если это так, то снова возникает вопрос - чем данная реализция лучше чем другие? Например Akka.NET.

Цитата Сообщение от Dedoc Посмотреть сообщение
Примеров нет, работа с TPL и обычными потоками не конструирование многопоточной программы. Это примерно как знание алфавита и писательское творчество, большая дистанция.
Так ты слона не продашь.

Цитата Сообщение от Dedoc Посмотреть сообщение
Зависимости от WPF нет, в библиотеке действительно используются классы платформы WPF
Если в библиотеке используются классы из WPF, то значит она зависит от WPF

Цитата Сообщение от Dedoc Посмотреть сообщение
Эта проблема автору известна, постараюсь исправить название, если получится.
Еще пара слов на исправление: Metod -> Method, Coment -> Comment, thred -> thread, Comanda -> Command, Tema -> Subject или Title. Плюс неплохо избавиться от названий на транслите: Metka -> Label, Cikl, otkuda -> Sender, kuda -> Recepient.

Цитата Сообщение от Psilon Посмотреть сообщение
Покажите проблему, которая возникает при многопоточном программировании, и как ваша библиотека её решает. Желательно показать преимущество над имеющимися средствами.
Присоединяюсь.
0
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
24.09.2015, 10:37  [ТС]
Psilon
Покажите проблему, которая возникает при многопоточном программировании, и как ваша библиотека её решает.

Две проблемы уже перечислены постом выше.
int result = arr.AsParallel().Sum(); // вернет 100 – нет, эта конструкция запустит метод отдельно, - это не то, что имелось ввиду при сглатывании данных.


OwenGlendower

Если метод сделать потокобезопасным, то я не понимаю зачем мне метод RunMetod.

Дело не в том, чтобы сделать метод потокобезопасным, а выдержать определенную сигнатуру метода. Сам метод – самый обычный, в теле метода нет никаких механизмов взаимодействия с потоками. Метод требует, чтобы входной аргумент и возвращаемое значение были типа Object и это все требование.

Не поверишь - Dispatcher.BeginInvoke делает ровно то же самое.
Согласен, в библиотеке реализована разновидность этого подхода.

Сам же механизм юнитов похож на реализацию идеи обмена сообщениями между отдельными частями приложения. И если это так, то снова возникает вопрос - чем данная реализция лучше чем другие? Например Akka.NET.
Никто не утверждает что реализация лучше или хуже, а по поводу Akka.NET не скажу, не знаком с ним.

И отдельное спасибо OwenGlendower за список синтаксических ошибок, исправлю.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.09.2015, 11:56
Dedoc, слова, слова... Покажите код.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18280 / 14203 / 5368
Регистрация: 17.03.2014
Сообщений: 28,883
Записей в блоге: 1
24.09.2015, 13:39
Цитата Сообщение от Dedoc Посмотреть сообщение
Две проблемы уже перечислены постом выше.
И мы уже разобрались что эти проблемы можно решить стандартными средствами.

Цитата Сообщение от Dedoc Посмотреть сообщение
Никто не утверждает что реализация лучше или хуже, а по поводу Akka.NET не скажу, не знаком с ним.
Тогда каким образом потенциальный пользователь поймет что ему необходима твоя библиотека? Забудем пока про сторонние библиотеки вроде Akka.NET. Хотелось бы увидеть пример демонстрирующий достоинства твоей библиотеки в сравнении со стандартными средствами. Иначе разговоры о преиумеществах библиотеки, остаются только словами.
0
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
25.09.2015, 11:02  [ТС]
OwenGlendower
Тогда каким образом потенциальный пользователь поймет что ему необходима ваша библиотека? Забудем пока про сторонние библиотеки вроде Akka.NET. Хотелось бы увидеть пример демонстрирующий достоинства библиотеки в сравнении со стандартными средствами. Иначе разговоры о преимуществах библиотеки, остаются только словами.

В демонстрационном примере(файл main.cs) есть образец работы с экранной формой из потока. Весь код занимает несколько десятков строк. Предложите вариант решения этой задачи стандартными методами с приемлемым объемом кода, и Вы быстро убедитесь в преимуществах библиотеки. Попробую усложнить этот пример с экранной формой, добавив вывод данных в одну экранную форму из нескольких потоков одновременно, такая задача для обычных средств будет крайне трудоемкой.
Библиотека освобождает пользователя от необходимости разрешать трудные моменты многопоточного программирования, беря на себя всю черновую работу.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18280 / 14203 / 5368
Регистрация: 17.03.2014
Сообщений: 28,883
Записей в блоге: 1
25.09.2015, 12:24
Цитата Сообщение от Dedoc Посмотреть сообщение
В демонстрационном примере(файл main.cs) есть образец работы с экранной формой из потока. Весь код занимает несколько десятков строк.
В main.cs 475 строк кода.

Цитата Сообщение от Dedoc Посмотреть сообщение
Предложите вариант решения этой задачи стандартными методами с приемлемым объемом кода, и Вы быстро убедитесь в преимуществах библиотеки.
Я запустил это приложение и мне непонятно какую задачу она решает.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.09.2015, 13:17
т.к. меня, очевидно, решили игнорировать, отписываюсь от темы Ничего интересного тут в любом случае.

Dedoc, а вам советую научиться пользоваться функцией цитирования. А то возникают подозрения в квалификации человека, который для такой просто вещи пишет свой "велосипед" с жирным выделением.
0
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
25.09.2015, 13:32  [ТС]
К примеру относится только этот кусок кода – 160 строк.


C#
1
2
3
4
5
6
7
8
9
10
11
public void Button3(object sender, EventArgs e)
        { KunstTable kunstTable = new  KunstTable()
           Func<object,int,object> f2  =  kunstTable.FunctionViewMail;
           Func<object,int,object> f1  = kunstTable.exampleKunstTable ;
        // Func<object,int,object> f2  =  viewMail.readMail;;      
         id11=  MyCoreParallel. CreateUnitAsServer(null,null,null, null, null,null);
         id12 = MyCoreParallel. CreateUnitAsClient(f1, null,f2,null, null,null);
          MyCoreParallel.BindingUnitToUnit(id11, id12); 
          CoreParallel.StartAllUnits();         
 
        }

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
public  class KunstTable
{
    public int num=-1; // номер юнита
    public CoreParallel.IdentificationMail[] mailArray = new CoreParallel.IdentificationMail[0];
    public   TableBase  tableBase = null;
    public  TableView tableView = null;
    public double  arg= 0.0d;
    public  int myFigure1;
    public  Command2DEditor command2DEditor=null;
 
    public int plan1, figure1, grafik1, func1 ; public double x=0.0d; public  double y=0.0d;
    public int uIElement1;
 
public   object TableBase(object param)
 {             if(  tableBase  ==null) 
          {
            tableView = new TableView(); 
            tableView.AddColumn("Column1"); tableView.AddColumn("Column2");  tableView.AddColumn("Column3");
            tableBase= new TableBase();
            tableBase.ShowGridLineOff();
            tableBase.   AddRowToUsel(0,300);  tableBase.   AddRowToUsel(0,300); tableBase.   AddRowToUsel(0,500);
            tableBase. AddColumnToRowFromUsel(0, 0,400);  tableBase. AddColumnToRowFromUsel(0, 0,-1);  tableBase.    AddColumnToRowFromUsel(0, 0,-1);
           tableBase. AddColumnToRowFromUsel(0, 1,-1); tableBase. AddColumnToRowFromUsel(0, 1,-1); tableBase. AddColumnToRowFromUsel(0, 1,-1); tableBase. AddColumnToRowFromUsel(0, 1,-1); 
           tableBase. AddColumnToRowFromUsel(0, 2,700); tableBase. AddColumnToRowFromUsel(0, 2,200);
 
 
Button button3= new Button(); 
    button3.Content="Button3"; 
 
   tableView.lv.HorizontalAlignment= HorizontalAlignment.Stretch;
   tableView.lv.VerticalAlignment= VerticalAlignment.Top;
 
    int uselFromUIelement3 = tableBase. CreateUselFromObject((object)tableView);
 
   tableBase.BindingCellToUsel(0,1,2, uselFromUIelement3);
   tableBase. AddColumnToRowFromUsel(0, 0,-1);  tableBase. AddColumnToRowFromUsel(0, 2,-1);  
   tableBase. AddColumnToRowFromUsel(0, 1,-1);
   tableBase. AddColumnToRowFromUsel(0, 1,-1);tableBase. AddColumnToRowFromUsel(0, 2,-1);
   tableBase. AddColumnToRowFromUsel(0, 0,-1);  tableBase. AddColumnToRowFromUsel(0, 0,-1); 
 
   
    Button button= new Button(); 
    button.Content="Button"; 
 
//..........................................command2DEditor................................................................
 
   command2DEditor = new Command2DEditor();
   int uselFromUIelement = tableBase. CreateUselFromObject((object)command2DEditor);
   tableBase.BindingCellToUsel(0,0,2, uselFromUIelement);
 
  plan1= command2DEditor.CreatePlan();
  figure1= command2DEditor.AddFigure();
  grafik1 = command2DEditor.AddPrimitive(figure1,"Function");
  command2DEditor.SetPrimitive(figure1,grafik1,"Function",plan1,100,100,440,420," X ","",12," Y ","",12);
  func1 = command2DEditor. AddFunctionToGrafic(figure1,grafik1);
 
  Button buttonGr= new Button(); buttonGr.Content="UIElement";
  uIElement1 = command2DEditor.AddPrimitive(figure1,"UIElement");
  command2DEditor.SetPrimitive(figure1,uIElement1,"UIElement",plan1,100,100,buttonGr);
  command2DEditor.RefreshFigure(figure1);
 
//..........................................................................................................
 
TextEditorCoreParallel textEditorCoreParallel = new TextEditorCoreParallel();
int uselFromextEditorCoreParallel  = tableBase. CreateUselFromObject((object)textEditorCoreParallel );
tableBase.BindingCellToUsel(0,0,0,uselFromextEditorCoreParallel );
 
 
 
 
           Button button1= new Button(); 
    button1.Content="Button1";
    Button button4= new Button(); 
    button4.Content="Button4";
    int uselFromUIelement4 = tableBase. CreateUselFromObject((object)button4);
    tableBase.SetVerticalAlignment ((int) VerticalAlignment.Center, uselFromUIelement4);
    tableBase.SetHorizontalAlignment ((int) HorizontalAlignment.Right, uselFromUIelement4);
 
 
    int usel2=   tableBase.CreateUsel(1); tableBase.AddColumnToRowFromUsel(0,usel2,-1); //         tableBase.AddColumnToRowFromUsel(0,usel2);  
    tableBase.AddRowToUsel(usel2,-1);
 
    int uselFromUIelement2 = tableBase. CreateUselFromObject((object)button1);
    tableBase.BindingCellToUsel(usel2,0,0, uselFromUIelement2); //  tableBase.BindingCellToUsel(0,1,1,usel2 );
    tableBase.AddColumnToRowFromUsel(usel2,1,-1);
    tableBase.BindingCellToUsel(usel2,0,1, uselFromUIelement4);
    tableBase.BindingCellToUsel(0,1,1,usel2 ); 
 
 
 
  end: tableBase.MakeTable();
  for(int i=0;i< 120;i++)    tableView .AddRecord(i,1,1);
 
 
  int planLine = command2DEditor.CreatePlan();
  Button bn = new Button();
 
} 
 
return null;
 
   } 
   public void Button1(object sender, EventArgs e)
{  MessageBox.Show("Press Button1");
}
 
 
 public object exampleKunstTable(object arg,int myUnit)  
{    
       if(num<0)  num= myUnit;
 
       CoreParallel.UserFormMail[] ufmArray = new CoreParallel.UserFormMail[1];
       CoreParallel.UserFormMail ufm  = new CoreParallel.UserFormMail();
       ufm.FromUnit=num;  ufm.ToUnit=0;    ufm.FuncArgument=(object)num;
       ufm.Func=   TableBase; ufm.Metka=0;
       ufmArray[0]=ufm;
       CoreParallel.units[num].unitMailSender. SetAndSendUserDataMailArray(ufmArray,0);
       Thread.Sleep(1);
return null;
}
 
 
public object FunctionViewMail(object param,int myUnit)
{      CoreParallel.UserFormMail[] ufmArray = new CoreParallel.UserFormMail[1];
       CoreParallel.UserFormMail ufm  = new CoreParallel.UserFormMail();
       ufm.FromUnit=myUnit;  ufm.ToUnit=0;    ufm.FuncArgument=(object)myUnit;
       ufm.Func=   FunctionView;
       ufmArray[0]=ufm;  ufm.Metka=0;
       CoreParallel.units[myUnit].unitMailSender. SetAndSendUserDataMailArray(ufmArray,0);
       Thread.Sleep(30);
       return null;
 }
 
public object FunctionView(object param)
{
 for(int i=0;i<17;i++){ y=  Math.Sin(x)*40; command2DEditor.AddPointFunctionToFigure(figure1,grafik1,func1,x,y);  x=x+0.05d; }
 
 
 
 command2DEditor.RefreshFigure(figure1);
  return null;
}
 
 
public object clearTable(object arg)  
   {
   //  tableViewMail.ClearTable();
     return null;
  }
}//class KunstTable
Добавлено через 4 минуты
Psilon
т.к. меня, очевидно, решили игнорировать, отписываюсь от темы

Ни в коем случае, даже не думайте об этом. Что конкретно не ответил?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18280 / 14203 / 5368
Регистрация: 17.03.2014
Сообщений: 28,883
Записей в блоге: 1
25.09.2015, 23:54
Цитата Сообщение от Dedoc Посмотреть сообщение
К примеру относится только этот кусок кода – 160 строк.
Какую именно задачу этот пример кода решает?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.09.2015, 12:24
Цитата Сообщение от Dedoc Посмотреть сообщение
вывод данных в одну экранную форму из нескольких потоков одновременно, такая задача для обычных средств будет крайне трудоемкой.
Я, конечно, не супер спец по многопоточному программированию, но кое-что знаю. И мне не совсем понятно, разве пример ниже (это, конечно, самый простой, но глядя на ваш код, в котором нет комментариев, голова начинает опухать, и нет желания вникать, что же он делает), очень трудоемкий? Просто явный маршалинг из потока в поток UI, и в чем тут трудоемкость?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
using System.Threading;
using System.Threading.Tasks;
 
namespace WindowsFormsApplication1 {
    public partial class Form1 : Form {
        static Random r = new Random();
        public Form1() {
            InitializeComponent();
            button1.Click += new EventHandler(button1_Click);
        }
 
        void button1_Click(object sender, EventArgs e) {
            button1.Enabled = false;
            Task.Factory.StartNew(() => Method_1());
            Task.Factory.StartNew(() => Method_2());
            Task.Factory.StartNew(() => Method_3());
        }
        void Method_1() {
            while (true) {
                label1.Invoke((Action)(() => { label1.Text = r.Next(1, 50).ToString(); }));
                Thread.Sleep(1000);
            }
        }
        void Method_2() {
            while (true) {
                label2.Invoke((Action)(() => { label2.Text = r.Next(1, 50).ToString(); }));
                Thread.Sleep(1000);
            }
        }
        void Method_3() {
            while (true) {
                label3.Invoke((Action)(() => { label3.Text = r.Next(1, 50).ToString(); }));
                Thread.Sleep(1000);
            }
        }
    }
}
Тут просто форма, кнопка и три лейбла. Теперь вы напишите тоже самое, с использованием вашей библиотеки, и сравним, как получается проще и короче)))
P.S. И да, как верно отметили, научитесь цитировать чужие высказывания, выделение просто режет глаз.
Делается это очень просто: выделяете фразу в браузере (нажатием левой мышки), и появляется всплывающая подсказка Цитировать. И все.
0
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
28.09.2015, 10:10  [ТС]
insite2012

Уважаемая публика, пожалуйста, не думайте что Dedoc изобрел многопоточное программирование. Так или иначе методы многопоточности известны давно и широко представлены в .NET. Легко запустить поток, трудности начинаются позже. Все вами приведенные примеры имеют один недостаток, не позволяющий их практическое применение – они не потокобезопасны. Строить на их основе программы, все одно, что строить дом на песке – толку не будет. Библиотека содержит не только методы запуска параллельных процессов, она обеспечивает их корректное выполнение при любой интенсивности обмена информацией между потоками, любой интенсивности вызова методов из потока. Притом пользователь разрабатывая многопоточную программу , совершенно не ощущает трудностей, подводных камней. Библиотека абсолютно гарантирует корректную работу пользовательского приложения при любых условиях. Кроме того , библиотека – это комплекс услуг, включающих методы доступа к экранной форме, заметьте, опять же этот доступ потокобезопасный. Библиотека предоставляет инструмент с помощью которого пользователь легко создает каркас многопоточной программы. Все части кода, помещенные в юниты , выполняются независимо друг от друга и одновременно. Встроенные в .NET средства многопотчности дают лишь возможность создавать по природе своей однопоточное приложение с элементами многопоточности.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
28.09.2015, 11:43
Dedoc,
C#
1
2
         id11=  MyCoreParallel. CreateUnitAsServer(null,null,null, null, null,null);
         id12 = MyCoreParallel. CreateUnitAsClient(f1, null,f2,null, null,null);
чую-чую-чую! Вдохновлялись винапи?

Ну и не обижайтесь, но форматирование, именование, завязка на WPF и то, что минимальный пример занимает 160 строк, в котором происходит всякое непонятное непотребство, намекают на общее качество этой библиотеки.

Нужно показать собственно 2 вещи, о чем вам уже говорят неделю. Сначала код обычный, с использованием стандартной библиотеки. Где все всё знают и сразу из кода поймут, что происходит (хотя, конечно, словами сначала нужно рассказать, чтобы суть смотреть, а не разбираться в нюансах), причем желательно не более 100 строк, а потом "и вот приходит наша многопоточная библиотечка и помогает!", строк 50. Из чего делаем вывод, что она вся такая хорошая и т.п.

Пример может быть простым - 1-2 кнопки на формочке, или пара текстбоксов, что угодно, что умещается в ~100 строк.

________________________________________ ___

Пример приведу. Как в .Net преобразовать структуру в набор байт? Причем любую структуру? Ну примерно так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        var data = GetSomeData();
        byte[] rawData = new byte[Marshal.SizeOf(data)];
        GCHandle handle = GCHandle.Alloc(rawData, GCHandleType.Pinned);
        try
        {
            IntPtr rawDataPtr = handle.AddrOfPinnedObject();
            Marshal.StructureToPtr(data, rawDataPtr, false);
        }
        finally
        {
            handle.Free();
        }
        
        SomeType result;
        GCHandle handle = GCHandle.Alloc(rawData, GCHandleType.Pinned);
        try
        {
            IntPtr rawDataPtr = handle.AddrOfPinnedObject();
            result = (SomeType) Marshal.PtrToStructure(rawDataPtr, typeof(SomeType ));
        }
        finally
        {
            handle.Free();
        }
А вот как можно то же самое сделать с помощью моей мини-библиотечки:


C#
1
2
3
var data = GetSomeData();
byte[] rawData = data.Serialize();
SomeType result = StructInterOp.Deserialize<SomeType>(rawData);
Причем это будет работать и быстрее, и по памяти лучше. Из чего делаем вывод, что библиотечка хорошая и ей можно пользоваться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.09.2015, 11:43
Помогаю со студенческими работами здесь

Нужен совет по архитектуре многопоточного приложения
Здравствуйте. Есть приложение WPF MVVM, которое обрабатывает файлы. Так как обработка файлов занимает время, то хотелось бы информировать...

Паттерны многопоточного программирования
Добрый день. Есть ли какие либо шаблоны. Есть желание с темой познакомиться хорошо. Пока хочу создание потоков и работу с ними...

Умножение матриц с использоанием многопоточного программирования
Нужно переделать однопоточное в многопоточное :( using System; using System.Collections.Generic; using System.Linq; using...

Время многопоточного выполнения функции
Этот код исполняется за 0.4 сек на моём компьюетере private void Foo() { for (int i = 0; i &lt; 100000000;...

Разработка многопоточного приложения для обучения
какую бы многопоточную программу написать новичку чтоб опыта набратся есть предложения?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru