Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.58/40: Рейтинг темы: голосов - 40, средняя оценка - 4.58
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5

Многопоточность и доступ к элементам формы

17.05.2017, 21:22. Показов 8269. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую, ребята, подскажите как и что лучше сделать.
Решил написать простенький парсер, в один поток работает все прекрасно, но страдает производительность, поэтому решил сделать многопоточную штуку. Есть несколько вопросов по реализации.
Если приложение будет многопоточным, то нужно будет всем потокам обращаться к разным записям одного списка адресов для парсинга. Создал свой класс, который обрабатывает страницы. Теперь стоит вопрос о том, как прикрутить многопоточность.
По сути, в потоке должен создаваться класс, который обрабатывает данные. Как эти данные обработать и передать на элементы управления? Например, как из потока получить запись из списка адресов, обработать ее в классе, и далее вывести результат обработки в другой элемент управления ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.05.2017, 21:22
Ответы с готовыми решениями:

Как получить доступ к элементам формы из другого обычного класса (не из второй формы)
Сабж. В гугле вся инфа только про доступ из другой формы, это я знаю. А вот как получить доступ из обычного модульного класса?

Доступ к элементам формы
Доброго времени суток. Не буду ходить вокруг да около. в общем, я занимаюсь программированием пару лет и вот решил освоить C#. До этого...

Доступ к элементам формы
Привет всем! Народ, такой вопрос. Можно ли организовать доступ к элементам формы через индексы? Например если они помещены в один...

21
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
22.05.2017, 09:20  [ТС]
Студворк — интернет-сервис помощи студентам
Rius, в вашем примере походу то, что нужно (только у вас решается через задачи), только вот с c# недавно начал знакомство, поэтом не пинайте
0
Эксперт .NET
 Аватар для Rius
13848 / 7890 / 1707
Регистрация: 25.05.2015
Сообщений: 23,958
Записей в блоге: 14
22.05.2017, 10:07
Не только задачи. С PLINQ запускается параллельная обработка через ForAll.
Данные отображаются через привязанный к списку DataGridView. Список не обычный List, а BindingList.
Элементы обрабатываемые являются не просто классом с данными, а ещё уведомляющим об изменении этих данных через INotifyPropertyChanged.
Когда надо изменить галочку, связанную со свойством IsChecked, в потоке UI выполняется код, просто меняющий это свойство.
При изменении свойства вызывается событие, обрабатываемое в BindingList и далее передаваемое в DataGridView. И всё само обновляется.

Добавлено через 31 минуту
Почтальон, вот допил до вашего: https://gist.github.com/riuson... 8d7e755f87
Кликните здесь для просмотра всего текста

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
151
diff --git a/Postal/Form1.Designer.cs b/Postal/Form1.Designer.cs
index dcab3a9..9cb43ab 100644
--- a/Postal/Form1.Designer.cs
+++ b/Postal/Form1.Designer.cs
@@ -33,6 +33,7 @@
             this.dataGridView1 = new System.Windows.Forms.DataGridView();
             this.ColumnIsChecked = new System.Windows.Forms.DataGridViewCheckBoxColumn();
             this.ColumnAddress = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.btnGetUrlsFromFile = new System.Windows.Forms.Button();
             ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
             this.SuspendLayout();
             // 
@@ -85,12 +86,23 @@
             this.ColumnAddress.HeaderText = "Address";
             this.ColumnAddress.Name = "ColumnAddress";
             // 
+            // btnGetUrlsFromFile
+            // 
+            this.btnGetUrlsFromFile.Location = new System.Drawing.Point(174, 12);
+            this.btnGetUrlsFromFile.Name = "btnGetUrlsFromFile";
+            this.btnGetUrlsFromFile.Size = new System.Drawing.Size(132, 23);
+            this.btnGetUrlsFromFile.TabIndex = 1;
+            this.btnGetUrlsFromFile.Text = "Get Urls From File...";
+            this.btnGetUrlsFromFile.UseVisualStyleBackColor = true;
+            this.btnGetUrlsFromFile.Click += new System.EventHandler(this.btnGetUrlsFromFile_Click);
+            // 
             // Form1
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
             this.ClientSize = new System.Drawing.Size(437, 562);
             this.Controls.Add(this.dataGridView1);
+            this.Controls.Add(this.btnGetUrlsFromFile);
             this.Controls.Add(this.buttonStop);
             this.Controls.Add(this.buttonStart);
             this.Name = "Form1";
@@ -107,6 +119,7 @@
         private System.Windows.Forms.DataGridView dataGridView1;
         private System.Windows.Forms.DataGridViewCheckBoxColumn ColumnIsChecked;
         private System.Windows.Forms.DataGridViewTextBoxColumn ColumnAddress;
+        private System.Windows.Forms.Button btnGetUrlsFromFile;
     }
 }
 
diff --git a/Postal/Form1.cs b/Postal/Form1.cs
index 71acfda..d54ce14 100644
--- a/Postal/Form1.cs
+++ b/Postal/Form1.cs
@@ -1,11 +1,10 @@
 using System;
-using System.Collections.Generic;
-using System.Collections.ObjectModel;
 using System.ComponentModel;
 using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Windows.Forms;
+using System.Xml;
 
 namespace Postal
 {
@@ -13,16 +12,16 @@ namespace Postal
     {
         private CancellationTokenSource mToken;
         private TaskScheduler mScheduler;
-        private BindingList<DataItem> mItems;
+        private BindingList<URL> mItems;
 
         public Form1()
         {
             InitializeComponent();
 
-            this.mItems = new BindingList<DataItem>();
+            this.mItems = new BindingList<URL>();
             var items = Enumerable.Range(0, 20)
                 .Select(x => String.Format("{0}.{0}.{0}.{0}", x))
-                .Select(x => new DataItem(x))
+                .Select(x => new URL(x))
                 .ToList();
             foreach (var item in items)
             {
@@ -70,22 +69,54 @@ namespace Postal
             this.mToken.Cancel();
         }
 
-        private void Parse(CancellationToken token, DataItem item)
+        private void Parse(CancellationToken token, URL item)
         {
+            //объявляем класс переменной для парсинга   
+            PageParser parse_data = new PageParser();
             // Длительная операция
             token.WaitHandle.WaitOne(1000);
-            string address = item.Address;
-            //...
+            item.IsChecked = parse_data.ParseUrl(item.Address);
             this.Report(token, item);
         }
 
-        private void Report(CancellationToken token, DataItem item)
+        private void Report(CancellationToken token, URL item)
         {
-            Task.Factory.StartNew(o => ((DataItem)o).IsChecked = true, item, token, TaskCreationOptions.None, this.mScheduler);
+            Task.Factory.StartNew(o => ((URL)o).IsChecked = true, item, token, TaskCreationOptions.None, this.mScheduler);
+        }
+
+        private void btnGetUrlsFromFile_Click(object sender, EventArgs e)
+        {
+            using (var openFileDialog = new OpenFileDialog())
+            {
+                if (openFileDialog.ShowDialog() == DialogResult.OK)
+                {
+                    this.mItems.Clear();
+
+                    //textbPathToFile.Text = openFileDialog.FileName;
+                    //читаем данные из файла
+                    using (XmlTextReader reader = new XmlTextReader(openFileDialog.FileName))
+                    {
+                        //обрабатываем данные файла
+                        while (reader.Read())
+                        {
+                            if (reader.Name == "loc")
+                            {
+                                reader.Read();
+                                //создаем объект для хранения адреса
+                                URL tmp_url = new URL(reader.Value);
+                                this.mItems.Add(tmp_url);
+                                reader.Read();
+                            }
+                        }
+                    }
+                    //присваиваем список на форме
+                    //checkLBUrlParse.DataSource = urls_list;
+                }
+            }
         }
     }
 
-    internal class DataItem : INotifyPropertyChanged
+    internal class URL : INotifyPropertyChanged
     {
         private string mAddress { get; set; }
         private bool mIsChecked { get; set; }
@@ -113,7 +144,7 @@ namespace Postal
             }
         }
 
-        public DataItem(string address)
+        public URL(string address)
         {
             this.Address = address;
             this.IsChecked = false;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.05.2017, 10:07

Доступ к элементам формы навигации
Здравствуйте. Я только начинаю осваивать формы навигации. Прошу помочь. Имеется форма навигации, элемент навигации содержит две кнопки...

Динамический доступ к элементам формы
Доброго времени суток уважаемые! Решил попробовать сделать одну программку, в которой более 100 параметров (Properties.Settings),...

Доступ к элементам формы из класса
Есть главное окно WPF - Window1 Я написал public accessor для изменения контрола /// Изменение прогресс бара public void...

Доступ к элементам другой формы
Добрый день! подскажите, как можно осуществить доступ к элементам другой формы. грубо говоря, мне надо из 2-й формы обновить содержимое...

Публичный доступ к элементам формы
подскажите пожалуйста просто способ, как сделать элементы на форме доступными в классе...


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru