25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
1

Многопоточность из класса

07.11.2016, 14:18. Показов 2426. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня есть Идентифицированный класс для получения ключа:
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
using System;
using System.Management;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
 
 
static class HardwareInfo
{
    static public string GetKey(bool bind_to_windows = !true)
    {
        var info = string.Join("|",
                GetProcessorId(),
                GetHDDSerialNo(),
                GetMACAddress(),
                GetBoardMaker(),
                GetBoardProductId(),
                GetBIOSmaker(),
                GetBIOSserNo(),
                GetBIOScaption(),
                GetPhysicalMemory(),
                GetNoRamSlots(),
                GetCPUManufacturer(),
                GetProcessorInformation()
 
        );
 
        if (bind_to_windows)
            info += '|' + string.Join("|",
                    GetOSInformation(),
                    GetAccountName(),
                    GetComputerName()
                    );
 
        var ByteResult = new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(info));
        string StringResult = string.Empty;
        foreach (byte b in ByteResult)
            StringResult += String.Format("{0:x2}", b).ToUpper();
        Regex regex = new Regex(@"(\w{1,8})");
        var Matches = regex.Matches(StringResult);
        string[] MsResult = new string[Matches.Count];
        for (int i = 0; i < Matches.Count; i++)
            MsResult[i] = Matches[i].Groups[1].Value;
 
        return string.Join("-", MsResult);
       // info = (Math.Pow(info.GetHashCode(), 5)) .ToString();
    }
    static String GetProcessorId()
    {
        ManagementClass mc = new ManagementClass("win32_processor");
        ManagementObjectCollection moc = mc.GetInstances();
        String Id = String.Empty;
        foreach (ManagementObject mo in moc)
        {
            Id = mo.Properties["processorID"].Value.ToString();
            break;
        }
        return Id;
    } 
    static String GetHDDSerialNo()
    {
        ManagementClass mangnmt = new ManagementClass("Win32_LogicalDisk");
        ManagementObjectCollection mcol = mangnmt.GetInstances();
        string result = "";
        foreach (ManagementObject strt in mcol)
        {
            result += Convert.ToString(strt["VolumeSerialNumber"]);
        }
        return result;
    }
    static string GetMACAddress()
    {
        ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
        ManagementObjectCollection moc = mc.GetInstances();
        string MACAddress = String.Empty;
        foreach (ManagementObject mo in moc)
        {
            if (MACAddress == String.Empty)
            {
                if ((bool)mo["IPEnabled"] == true) MACAddress = mo["MacAddress"].ToString();
            }
            mo.Dispose();
        }
 
        MACAddress = MACAddress.Replace(":", "");
        return MACAddress;
    }
    static string GetBoardMaker()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_BaseBoard");
        foreach (ManagementObject wmi in searcher.Get())
        {
            try
            {
                return wmi.GetPropertyValue("Manufacturer").ToString();
            }
            catch { }
        }
        return "Board Maker: Unknown";
    }
    static string GetBoardProductId()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_BaseBoard");
        foreach (ManagementObject wmi in searcher.Get())
        {
            try
            {
                return wmi.GetPropertyValue("Product").ToString();
            }
            catch { }
        }
        return "Product: Unknown";
    }
    static string GetCdRomDrive()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_CDROMDrive");
        foreach (ManagementObject wmi in searcher.Get())
        {
            try
            {
                return wmi.GetPropertyValue("Drive").ToString();
            }
            catch { }
        }
       return "CD ROM Drive Letter: Unknown";
    }
    static string GetBIOSmaker()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_BIOS");
        foreach (ManagementObject wmi in searcher.Get())
        {
            try
            {
                return wmi.GetPropertyValue("Manufacturer").ToString();
            }
            catch { }
        }
        return "BIOS Maker: Unknown";
    }
    static string GetBIOSserNo()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_BIOS");
        foreach (ManagementObject wmi in searcher.Get())
        {
            try
            {
                return wmi.GetPropertyValue("SerialNumber").ToString();
            }
            catch { }
        }
        return "BIOS Serial Number: Unknown";
    }
    static string GetBIOScaption()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_BIOS");
        foreach (ManagementObject wmi in searcher.Get())
        {
            try
            {
                return wmi.GetPropertyValue("Caption").ToString();
            }
            catch { }
        }
        return "BIOS Caption: Unknown";
    }
    static string GetAccountName()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_UserAccount");
        foreach (ManagementObject wmi in searcher.Get())
        {
            try
            {
                return wmi.GetPropertyValue("Name").ToString();
            }
            catch { }
        }
        return "User Account Name: Unknown";
    }
    static string GetPhysicalMemory()
    {
        ManagementScope oMs = new ManagementScope();
        ObjectQuery oQuery = new ObjectQuery("SELECT Capacity FROM Win32_PhysicalMemory");
        ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs, oQuery);
        ManagementObjectCollection oCollection = oSearcher.Get();
        long MemSize = 0;
        long mCap = 0;
        foreach (ManagementObject obj in oCollection)
        {
            mCap = Convert.ToInt64(obj["Capacity"]);
            MemSize += mCap;
        }
        MemSize = (MemSize / 1024) / 1024;
        return MemSize.ToString() + "MB";
    }
    static string GetNoRamSlots()
    {
        int MemSlots = 0;
        ManagementScope oMs = new ManagementScope();
        ObjectQuery oQuery2 = new ObjectQuery("SELECT MemoryDevices FROM Win32_PhysicalMemoryArray");
        ManagementObjectSearcher oSearcher2 = new ManagementObjectSearcher(oMs, oQuery2);
        ManagementObjectCollection oCollection2 = oSearcher2.Get();
        foreach (ManagementObject obj in oCollection2)
        {
            MemSlots = Convert.ToInt32(obj["MemoryDevices"]);
        }
        return MemSlots.ToString();
    }
    static string GetCPUManufacturer()
    {
        string cpuMan = String.Empty;
        //create an instance of the Managemnet class with the
        //Win32_Processor class
        ManagementClass mgmt = new ManagementClass("Win32_Processor");
        //create a ManagementObjectCollection to loop through
        ManagementObjectCollection objCol = mgmt.GetInstances();
        //start our loop for all processors found
        foreach (ManagementObject obj in objCol)
        {
            if (cpuMan == String.Empty)
            {
                // only return manufacturer from first CPU
                cpuMan = obj.Properties["Manufacturer"].Value.ToString();
            }
        }
        return cpuMan;
    }
    static string GetDefaultIPGateway()
    {
        //create out management class object using the
        //Win32_NetworkAdapterConfiguration class to get the attributes
        //of the network adapter
        ManagementClass mgmt = new ManagementClass("Win32_NetworkAdapterConfiguration");
        //create our ManagementObjectCollection to get the attributes with
        ManagementObjectCollection objCol = mgmt.GetInstances();
        string gateway = String.Empty;
        //loop through all the objects we find
        foreach (ManagementObject obj in objCol)
        {
            if (gateway == String.Empty)  // only return MAC Address from first card
            {
                //grab the value from the first network adapter we find
                //you can change the string to an array and get all
                //network adapters found as well
                //check to see if the adapter's IPEnabled
                //equals true
                if ((bool)obj["IPEnabled"] == true)
                {
                    gateway = obj["DefaultIPGateway"].ToString();
                }
            }
            //dispose of our object
            obj.Dispose();
        }
        //replace the ":" with an empty space, this could also
        //be removed if you wish
        gateway = gateway.Replace(":", "");
        //return the mac address
        return gateway;
    }
    static string GetOSInformation()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem");
        foreach (ManagementObject wmi in searcher.Get())
        {
            try
            {
                return ((string)wmi["Caption"]).Trim() + ", " + (string)wmi["Version"] + ", " + (string)wmi["OSArchitecture"];
            }
            catch { }
        }
        return "BIOS Maker: Unknown";
    }
    static String GetProcessorInformation()
    {
        ManagementClass mc = new ManagementClass("win32_processor");
        ManagementObjectCollection moc = mc.GetInstances();
        String info = String.Empty;
        foreach (ManagementObject mo in moc)
        {
            string name = (string)mo["Name"];
            name = name.Replace("(TM)", "™").Replace("(tm)", "™").Replace("(R)", "®").Replace("(r)", "®").Replace("(C)", "©").Replace("(c)", "©").Replace("    ", " ").Replace("  ", " ");
 
            info = name + ", " + (string)mo["Caption"] + ", " + (string)mo["SocketDesignation"];
            //mo.Properties["Name"].Value.ToString();
            //break;
        }
        return info;
    }
    static String GetComputerName()
    {
        ManagementClass mc = new ManagementClass("Win32_ComputerSystem");
        ManagementObjectCollection moc = mc.GetInstances();
        String info = String.Empty;
        foreach (ManagementObject mo in moc)
        {
            info = (string)mo["Name"];
            //mo.Properties["Name"].Value.ToString();
            //break;
        }
        return info;
    }
}
При вызове класса, зависает форма, до появления ключа))
C#
1
HardwareInfo.GetKey();
Как сделать появления ключа при запуске формы? ( Без зависания) !
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.11.2016, 14:18
Ответы с готовыми решениями:

Многопоточность: Относительно двух разных экземпляров класса требуется вызвать одну и ту же функцию
Есть класс, относительно двух разных его экземпляров требуется вызвать одну и ту же функцию....

C++ Как в многопоточность передать объект класса?
Доброго времени суток! Подскажите пожалуйста одну вещь, у меня есть функция внутри класса и мне...

Как связать сигнал одного класса со слотом другого класса, содержащего указатель на объект этого класса?
Подскажите, пожалуйста, как связать сигнал одного класса со слотом другого класса, содержащего...

Инициализация шаблонного класса(В конструкторе класса после двоеточия вновь имя класса)
Всем доброго времени суток! Пытаюсь разобраться как работает приведенный мной код. Конкретно,...

17
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
07.11.2016, 16:33 2
Лучший ответ Сообщение было отмечено chaleureux как решение

Решение

C#
1
2
3
4
static public async Task<string> GetKeyAsync(bool bind_to_windows = !true)
{
     return await Task.Factory.StartNew(() => GetKey(bind_to_windows));
}
Вызов:
C#
1
string key = await GetKeyAsync();
Как-то так вроде
1
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
07.11.2016, 17:55  [ТС] 3
TopLayer, Чёт не катит
C#
1
static public string async Task<string> GetKey(bool bind_to_windows = !true)
HTML5
1
Неявное преобразование типа "string" в "System.Threading.Tasks.Task<string>" невозможно
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
07.11.2016, 18:47 4
chaleureux, ну Вы и не то написали, что я советовал. Я имел ввиду добавить в класс HardwareInfo метод-обёртку для GetKey:
C#
1
2
3
4
static public async Task<string> GetKeyAsync(bool bind_to_windows = !true)
{
     return await Task.Factory.StartNew(() => GetKey(bind_to_windows));
}
0
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
07.11.2016, 19:49  [ТС] 5
TopLayer, async Он требует класс делегата перечисления, интерфейс или структура)
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
07.11.2016, 20:04 6
chaleureux, выложите код HardwareInfo и Вашей формы
0
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
07.11.2016, 20:41  [ТС] 7
Ну так выложил же код HardwareInfo ) - Это класс
Ну и просто в Form_Load вызываю:
C#
1
2
3
4
private void Form_Load(object sender, EventArgs e)
        {
           TextBox.Text = HardwareInfo.GetKey();
        }
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
07.11.2016, 20:52 8
Перепишите вот так
C#
1
2
3
4
        private async void Form_Load(object sender, EventArgs e)
        {
           TextBox.Text = await HardwareInfo.GetKeyAsync();
        }
0
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
07.11.2016, 20:55  [ТС] 9
TopLayer, Окей) А как быть с классом, я не могу присвоить ему:
C#
1
static public async Task<string> GetKeyAsync(bool bind_to_windows = !true)
Если у Вас работает, выложите проект! А то чёт не ахти
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
07.11.2016, 21:08 10
Цитата Сообщение от chaleureux Посмотреть сообщение
Ну так выложил же код HardwareInfo ) - Это класс
Я имел ввиду после правок, которые привели к ошибке компиляции

Добавлено через 11 минут
Вот, надеюсь сможете спроецировать на Ваш проект.
Кликните здесь для просмотра всего текста
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
using System;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Test
{
    class MainForm: Form
    {
        public MainForm()
        {
            this.Load += MainForm_Load;
        }
 
        private async void MainForm_Load(object sender, System.EventArgs e)
        {
            this.Text = await HardwareInfo.GetKeyAsync();
        }
 
        [STAThread]
        static void Main()
        {
            Application.Run(new MainForm());
        }
    }
 
    static class HardwareInfo
    {
        public static async Task<string> GetKeyAsync(bool bind_to_windows = !true)
        {
            return await Task.Factory.StartNew(() => GetKey());
        }
 
        private static double temp;
        public static string GetKey()
        {
 
            for (var i = 0; i < 1000*1000*1000; ++i) // Типо долго вычисляем ключ
                temp += i/200000000.0;
            return "KEY";
        }
    }
}
0
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
07.11.2016, 21:15  [ТС] 11
У меня всё ровно не выходит чё-то, может лучше будет если я скину сам класс, а Вы смогёте его переделать?!)
Вложения
Тип файла: rar HardwareInfo.rar (2.3 Кб, 2 просмотров)
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
07.11.2016, 21:23 12
Так вы проект скидывайте а не 1 файл !!!
0
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
07.11.2016, 21:30  [ТС] 13
Ну как бы вот проект!
Вложения
Тип файла: rar TheBestKey.rar (49.9 Кб, 2 просмотров)
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
07.11.2016, 21:58 14
chaleureux, Это необходимо, чтобы проект был под Net framework 4 client profile?

Добавлено через 3 минуты
Хотя неважно. Замените код формы на этот.
Кликните здесь для просмотра всего текста
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.Threading.Tasks;
using System.Windows.Forms;
 
namespace TheBestKey
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Task.Factory.StartNew(() => HardwareInfo.GetKey())
                .ContinueWith(t =>
                {
                    this.BeginInvoke(new Action(() =>
                    {
                        textBox1.Text = t.Result;
                    }));
                });
        }
    }
}
0
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
07.11.2016, 22:17  [ТС] 15
При запуске ничего не происходит!
После закрытия выскакивает исключение!
HTML5
1
Была предпринята попытка освободить RCW, находящийся в использовании.  RCW используется активным потоком или другим потоком.  Попытка освободить RCW, находящийся в использовании, может привести к повреждению или потере данных.
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
07.11.2016, 22:48 16
chaleureux, ну тут нужны какие-то специализированные знания. У меня на компьютере всё отлично работает.
Вряд ли я смогу помочь...

Добавлено через 10 минут
Цитата Сообщение от chaleureux Посмотреть сообщение
При запуске ничего не происходит!
Дебажьте метод GetKey

Добавлено через 14 минут
До правок форма надолго зависала?
0
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
07.11.2016, 22:49  [ТС] 17
Цитата Сообщение от TopLayer Посмотреть сообщение
До правок форма надолго зависала?
секунд 5
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
07.11.2016, 22:51 18
Если в моей версии результат долго не отображается это значит, что метод GetKey долго работает. Убедитесь с помощью дебагера, что этот метод нормально выполняется. А если нет - то на каком этапе он виснет.
0
07.11.2016, 22:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.11.2016, 22:51
Помогаю со студенческими работами здесь

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

C++ 11 многопоточность
Всем привет!!!Я пытаюсь сделать , подобие прогресс -бара, и столкнулся с проблемой при изучении...

Многопоточность
Не особо понимаю мнопоточность в с++. Есть задание типа.... Сделать программу, иммитирующую работу...

Многопоточность
Добрый день, уважаемые гуру многопоточного программирование. Если Вас не затруднит, ответьте...

Многопоточность
Подскажите плиз по многопоточности, как правильно работать с потоками? конкретная проблема - не...

Многопоточность
Доброго времени суток! Прокомментируйте пожалуйста данный код по использованию потоков. В чем его...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru