Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/40: Рейтинг темы: голосов - 40, средняя оценка - 4.85
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 39

Как задействовать все процессоры для выполнения программы c++?

08.08.2015, 09:39. Показов 8491. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Столкнулся с такой проблемой.

При выполнении программы c++ (я использую Microsoft Visual Studio 2015) компиллятор показывает использования лишь 10-13% процессоров (у меня их 8 по 3.4 ГГЦ).

Как же использовать все процессоры для выполнения программы?

Быстродействие этой программы очень важно, ведь она высчитывает числа.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.08.2015, 09:39
Ответы с готовыми решениями:

VC++ 2008, как задействовать все ядра CPU под расчеты
Есть необходимость задействовать все ядра процессора для решения математической задачи, а то на текущий момент программа использует только...

Стоило задействовать, по одному из советов, все ядра процессоров из 4, как перестала загружаться винда
Значит, после совета по увеличению производительности процессора и его следованию, после перезагрузки ПК перестала грузится винда. Синий...

Как задействовать встроеную видеокарту для другого монитора?
На материнке есть встроеная видеокарта. При вставке внешней встроенй не видно в диспечере и не омогает даже INIT DISPLAY FIST(хотя когда...

40
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
08.08.2015, 09:42
Зависит от конкретной задачи.
Существуют разные средства: OpenMP, CilkPlus, TBB и т.п.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.08.2015, 09:43
Разбить программу на восемь потоков созданных через std::thread. Правда, для ряда алгоритмов это принципиально невозможно (ситуация "чтобы выносить ребенка надо девять месяцев, независимо от числа участвующих в процессе дам").
0
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 39
08.08.2015, 09:48  [ТС]
Мне нужно для каждого числа вычислить его md5 хеш.

Вот код программы (сначала идут 2 функции, которые вычисляют md5 хеш для строки, а потом в теле main() идет главный код):

md5.cpp

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
#include <iostream>
#include <time.h>
#include <string>
#include <fstream>
#include <sstream>
#include <math.h>
#include "md5.h"
 
using namespace std;
 
uint F(uint X, uint Y, uint Z) { return ((X & Y) | ((~X) & Z)); }
uint G(uint X, uint Y, uint Z) { return (X & Z) | (Y & (~Z)); }
uint H(uint X, uint Y, uint Z) { return X ^ Y ^ Z; }
uint I(uint X, uint Y, uint Z) { return Y ^ (X | (~Z)); }
uint rotate_left(uint value, int shift) { return value << shift | value >> (32 - shift); }
 
string to_hex(uint value)
{
    string out;
    unsigned char hex;
    char hex_res[3];
    while (value)
    {
        hex = value % 256;
        _itoa_s(hex, hex_res, 16);
        if (hex_res[1] == '\0')
        {
            hex_res[1] = hex_res[0];
            hex_res[0] = '0';
            hex_res[2] = '\0';
        }
        out.append(hex_res);
        value /= 256;
    }
    return out;
}
 
string get_md5(string in)
{
    int length = in.length();
    int rest = length % 64;
    int size = 0;
 
    if (rest < 56)
        size = length - rest + 56 + 8;
    else
        size = length + 64 - rest + 56 + 8;
 
    unsigned char *msg_for_decode = new unsigned char[size];
 
    for (int i = 0; i < length; i++)
        msg_for_decode[i] = in[i];
    msg_for_decode[length] = 0x80;
    for (int i = length + 1; i < size; i++)
        msg_for_decode[i] = 0;
 
    __int64 bit_length = (uint)(length)* 8;
 
    for (int i = 0; i < 8; i++)
        msg_for_decode[size - 8 + i] = (unsigned char)(bit_length >> i * 8);
 
    uint A = 0x67452301, B = 0xefcdab89, C = 0x98badcfe, D = 0x10325476;
    uint T[64];
 
    for (int i = 0; i<64; i++)
        T[i] = uint(pow(2, 32)*fabs(sin(i + 1)));
 
    uint *X = (uint*)(msg_for_decode);
 
    uint AA = 0, BB = 0, CC = 0, DD = 0;
 
    for (int i = 0; i < size / 4; i += 16) {
        AA = A; BB = B; CC = C; DD = D;
 
        //раунд 1
        A = B + rotate_left((A + F(B, C, D) + X[i + 0] + T[0]), 7);
        D = A + rotate_left((D + F(A, B, C) + X[i + 1] + T[1]), 12);
        C = D + rotate_left((C + F(D, A, B) + X[i + 2] + T[2]), 17);
        B = C + rotate_left((B + F(C, D, A) + X[i + 3] + T[3]), 22);
 
        A = B + rotate_left((A + F(B, C, D) + X[i + 4] + T[4]), 7);
        D = A + rotate_left((D + F(A, B, C) + X[i + 5] + T[5]), 12);
        C = D + rotate_left((C + F(D, A, B) + X[i + 6] + T[6]), 17);
        B = C + rotate_left((B + F(C, D, A) + X[i + 7] + T[7]), 22);
 
        A = B + rotate_left((A + F(B, C, D) + X[i + 8] + T[8]), 7);
        D = A + rotate_left((D + F(A, B, C) + X[i + 9] + T[9]), 12);
        C = D + rotate_left((C + F(D, A, B) + X[i + 10] + T[10]), 17);
        B = C + rotate_left((B + F(C, D, A) + X[i + 11] + T[11]), 22);
 
        A = B + rotate_left((A + F(B, C, D) + X[i + 12] + T[12]), 7);
        D = A + rotate_left((D + F(A, B, C) + X[i + 13] + T[13]), 12);
        C = D + rotate_left((C + F(D, A, B) + X[i + 14] + T[14]), 17);
        B = C + rotate_left((B + F(C, D, A) + X[i + 15] + T[15]), 22);
 
        //раунд 2
        A = B + rotate_left((A + G(B, C, D) + X[i + 1] + T[16]), 5);
        D = A + rotate_left((D + G(A, B, C) + X[i + 6] + T[17]), 9);
        C = D + rotate_left((C + G(D, A, B) + X[i + 11] + T[18]), 14);
        B = C + rotate_left((B + G(C, D, A) + X[i + 0] + T[19]), 20);
 
        A = B + rotate_left((A + G(B, C, D) + X[i + 5] + T[20]), 5);
        D = A + rotate_left((D + G(A, B, C) + X[i + 10] + T[21]), 9);
        C = D + rotate_left((C + G(D, A, B) + X[i + 15] + T[22]), 14);
        B = C + rotate_left((B + G(C, D, A) + X[i + 4] + T[23]), 20);
 
        A = B + rotate_left((A + G(B, C, D) + X[i + 9] + T[24]), 5);
        D = A + rotate_left((D + G(A, B, C) + X[i + 14] + T[25]), 9);
        C = D + rotate_left((C + G(D, A, B) + X[i + 3] + T[26]), 14);
        B = C + rotate_left((B + G(C, D, A) + X[i + 8] + T[27]), 20);
 
        A = B + rotate_left((A + G(B, C, D) + X[i + 13] + T[28]), 5);
        D = A + rotate_left((D + G(A, B, C) + X[i + 2] + T[29]), 9);
        C = D + rotate_left((C + G(D, A, B) + X[i + 7] + T[30]), 14);
        B = C + rotate_left((B + G(C, D, A) + X[i + 12] + T[31]), 20);
 
        //раунд 3
        A = B + rotate_left((A + H(B, C, D) + X[i + 5] + T[32]), 4);
        D = A + rotate_left((D + H(A, B, C) + X[i + 8] + T[33]), 11);
        C = D + rotate_left((C + H(D, A, B) + X[i + 11] + T[34]), 16);
        B = C + rotate_left((B + H(C, D, A) + X[i + 14] + T[35]), 23);
 
        A = B + rotate_left((A + H(B, C, D) + X[i + 1] + T[36]), 4);
        D = A + rotate_left((D + H(A, B, C) + X[i + 4] + T[37]), 11);
        C = D + rotate_left((C + H(D, A, B) + X[i + 7] + T[38]), 16);
        B = C + rotate_left((B + H(C, D, A) + X[i + 10] + T[39]), 23);
 
        A = B + rotate_left((A + H(B, C, D) + X[i + 13] + T[40]), 4);
        D = A + rotate_left((D + H(A, B, C) + X[i + 0] + T[41]), 11);
        C = D + rotate_left((C + H(D, A, B) + X[i + 3] + T[42]), 16);
        B = C + rotate_left((B + H(C, D, A) + X[i + 6] + T[43]), 23);
 
        A = B + rotate_left((A + H(B, C, D) + X[i + 9] + T[44]), 4);
        D = A + rotate_left((D + H(A, B, C) + X[i + 12] + T[45]), 11);
        C = D + rotate_left((C + H(D, A, B) + X[i + 15] + T[46]), 16);
        B = C + rotate_left((B + H(C, D, A) + X[i + 2] + T[47]), 23);
 
        //раунд 4
        A = B + rotate_left((A + I(B, C, D) + X[i + 0] + T[48]), 6);
        D = A + rotate_left((D + I(A, B, C) + X[i + 7] + T[49]), 10);
        C = D + rotate_left((C + I(D, A, B) + X[i + 14] + T[50]), 15);
        B = C + rotate_left((B + I(C, D, A) + X[i + 5] + T[51]), 21);
 
        A = B + rotate_left((A + I(B, C, D) + X[i + 12] + T[52]), 6);
        D = A + rotate_left((D + I(A, B, C) + X[i + 3] + T[53]), 10);
        C = D + rotate_left((C + I(D, A, B) + X[i + 10] + T[54]), 15);
        B = C + rotate_left((B + I(C, D, A) + X[i + 1] + T[55]), 21);
 
        A = B + rotate_left((A + I(B, C, D) + X[i + 8] + T[56]), 6);
        D = A + rotate_left((D + I(A, B, C) + X[i + 15] + T[57]), 10);
        C = D + rotate_left((C + I(D, A, B) + X[i + 6] + T[58]), 15);
        B = C + rotate_left((B + I(C, D, A) + X[i + 13] + T[59]), 21);
 
        A = B + rotate_left((A + I(B, C, D) + X[i + 4] + T[60]), 6);
        D = A + rotate_left((D + I(A, B, C) + X[i + 11] + T[61]), 10);
        C = D + rotate_left((C + I(D, A, B) + X[i + 2] + T[62]), 15);
        B = C + rotate_left((B + I(C, D, A) + X[i + 9] + T[63]), 21);
 
        A += AA;
        B += BB;
        C += CC;
        D += DD;
    }
 
    delete[]msg_for_decode;
    string res = to_hex(A) + to_hex(B) + to_hex(C) + to_hex(D);
    return res;
}
 
int main()
{
    setlocale(LC_ALL, "rus");
 
    ofstream file;
 
    file.open("hashes.txt");
 
    clock_t clock();
 
    for (long double i = 0.1500000000000000; i <= 0.1500000000100000; i += 0.0000000000000001)
    {
        string str;
        
        ostringstream sout;
        
        sout.precision(16);
 
        sout.setf(ios::fixed);
 
        sout << i;
 
        str = sout.str();
 
        file << str << ":   " << get_md5(str) << endl;
    }
 
    cout << (clock() / CLOCKS_PER_SEC) << endl << endl;
 
    file.close();
 
    system("PAUSE");
 
    return 0;
}


md5.h:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* Деректива препроцессора #pragma once следит за тем,
чтобы конкретный исходный файл при компиляции
подключался только один раз*/
#pragma once
#include <string>
/*«определяем» тип unsigned int как uint. Теперь везде в коде, где
будет встречаться слово uint, компилятор будет вставлять unsigned int*/
typedef unsigned int uint;
 
std::string to_hex(uint value);
uint F(uint X, uint Y, uint Z);
uint G(uint X, uint Y, uint Z);
uint H(uint X, uint Y, uint Z);
uint I(uint X, uint Y, uint Z);
uint rotate_left(uint value, int shift);
std::string get_md5(std::string in);
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.08.2015, 10:14
Для параллельной работы нескольких процессоров, нужно чтобы они не пытались писать в данные друг друга. А это значит:
1) Никаких new/delete, потому как они пишут в общий хип. Соответственно, один процессор будет писать, остальные ждать пока он освободится.
2) Никаких стандартных контейнеров, ибо 90% из них тоже пишут в общий хип. Да, возвращать стринг из функции тоже нельзя.
3) Никаких глобальных переменных.
Короче, переписывать код придется сверху донизу.

Ну а если делать попроще, то просто запустите восемь копий программы, каждая из которых будет обрабатывать свою порцию входных данных.
0
Заблокирован
08.08.2015, 13:10
T_P_A_K_T_O_P, MD5 блочный шифр, на каждом раунде работаем с данными предыдущего, сделать раунд в потоке не выйдет - это однопоточный алгоритм, нагрузку между процессорами распределяет планировщик ОС и если он решит что то разбросить на другое ядро то сделает.

Добавлено через 1 минуту
Цитата Сообщение от T_P_A_K_T_O_P Посмотреть сообщение
for (int i = 0; i<64; i++)
* * * * T[i] = uint(pow(2, 32)*fabs(sin(i + 1)));
- я бы рекомендовал просто провести оптимизацию и изъять вот такие "ресурсозатраные участки", чтобы не было лишних сопутствующих вычислений.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.08.2015, 13:33
Цитата Сообщение от ОгУрЕц Посмотреть сообщение
T_P_A_K_T_O_P, MD5 блочный шифр, на каждом раунде работаем с данными предыдущего
Но в теории можно выполнять несколько get_md5 параллельно.
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
08.08.2015, 13:44
Цитата Сообщение от Renji Посмотреть сообщение
Но в теории можно выполнять несколько get_md5 параллельно.
Тогда по одной get_md5 на поток, делов-то.
0
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
08.08.2015, 15:18
Ошибка.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
08.08.2015, 15:22
Может поможет https://software.intel.com/en-... -functions
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.08.2015, 15:38
Цитата Сообщение от Enno Посмотреть сообщение
Тогда по одной get_md5 на поток, делов-то.
У ТС в get_md5 динамическая память используется. Многопоточный менеджер памяти будет пинать синхронизацию, а синхронизация замораживать все соседние потоки.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.08.2015, 16:23
Цитата Сообщение от Renji Посмотреть сообщение
Многопоточный менеджер памяти будет пинать синхронизацию, а синхронизация замораживать все соседние потоки.
прям такая страшная конкуренция получится?
0
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
08.08.2015, 16:39
Вот как-то так:
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
#include <thread> 
#include <future>
 
// процесс вычисления MD5
string calc_md5(string &str_in)
{
    return str_in + str_in; 
}
 
// запускаем 2 асинхронных процесса
int main(int argc, char *argv[])
{
    setlocale(LC_CTYPE, "russian");
 
    // входные данные:
    string s1 = "aa";
    string s2 = "bb";
    
    std::future<std::string> ret_1 = std::async(&calc_md5, s1);
    string result_1 = ret_1.get();
 
    std::future<std::string> ret_2 = std::async(&calc_md5,s2);
    string result_2 = ret_2.get();
 
    std::cout << "MD5 1: " << result_1 << endl;
    std::cout << "MD5 2: " << result_2 << endl;
    return 0;
}
Результат:
MD5 1: aaaa
MD5 2: bbbb

0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
08.08.2015, 16:40
Цитата Сообщение от Renji Посмотреть сообщение
Многопоточный менеджер памяти будет пинать синхронизацию, а синхронизация замораживать все соседние потоки.
Своя куча на каждый поток. Эта функция не состоит целиком из выделения и освобождения памяти, чтобы учитывать какие-то малозначительные остановки для синхронизации.
0
Заблокирован
08.08.2015, 20:16
Цитата Сообщение от Renji Посмотреть сообщение
Но в теории можно выполнять несколько get_md5 параллельно.
- к примеру на одноядерном процессоре это приведёт к ещё большим потерям(на переключение между потоками), максимальное ускорение - это одноверменный запуск get_md5 по числу ядер(надеемся что планировщик распихает потоки на разные ядра).
0
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
09.08.2015, 00:47
Цитата Сообщение от ОгУрЕц Посмотреть сообщение
к примеру на одноядерном процессоре это приведёт к ещё большим потерям
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <thread>
int main(int argc, char *argv[])
{
    setlocale(LC_CTYPE, "russian");
 
    unsigned int number_of_processors = std::thread::hardware_concurrency();
    std::cout << "Поддерживаемое число параллельных процессов = " << number_of_processors << endl;
 
    if (number_of_processors < 2)
    {
        std::cout << " На одном процессоре не считаем. Приходите завтра.\n";
        return 0;
    }
}
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
09.08.2015, 08:07
Цитата Сообщение от ОгУрЕц Посмотреть сообщение
максимальное ускорение - это одноверменный запуск get_md5 по числу ядер(надеемся что планировщик распихает потоки на разные ядра).
Не всегда. У меня с диплома остались тесты производительности по потокам. Смотря на них можно сказать что решающим фактором становится ещё и объём вычислений. Ориентировался на скорость(размер_вычислений)*количество_п отоков.
0
0 / 0 / 0
Регистрация: 01.08.2015
Сообщений: 32
09.08.2015, 08:24
Если в вычислениях интенсивно задействована оперативная память, то одновременный запуск одной программы на нескольких ядрах мало что даст, разве что потерю времени.
0
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
09.08.2015, 09:49
Цитата Сообщение от George_ Посмотреть сообщение
Если в вычислениях интенсивно задействована оперативная память, то одновременный запуск одной программы на нескольких ядрах мало что даст, разве что потерю времени.
Хэши MD5 вряд ли будут считать на планшете или смартфоне.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
09.08.2015, 09:52
Цитата Сообщение от George_ Посмотреть сообщение
Если в вычислениях интенсивно задействована оперативная память...
Дело не в интенсивности использования ОЗУ, а в совместном её использовании разными потоками.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.08.2015, 09:52
Помогаю со студенческими работами здесь

Как задействовать многопоточность для обработки больших запросов в WebBrowser
Здравствуйте,нужна помощь. Как создать потоки,многопоточность,в программе присутствует веб браузер,далее цикл на поиск некого значение на...

Как задействовать программу пароля для ноута по отпечатку пальца?
Процедура сброса БИОСа замыканием контактов батарейки и запуска ноута Леново без харда и озу не сработала. Сбросить удалось практически...

Как реализовать задержку выполнения определённой части программы без полной задержки всей программы?
Ниже представлен упрощённый код игры, в которой герой управляется ПКМ и подбирает предметы ЛКМ, которые перемещаются в инвентарь....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru