Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 10.08.2012
Сообщений: 60

Параллельный поток с параметром. Как ускорить работу

08.05.2024, 11:50. Показов 1047. Ответов 14

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Я подсчитываю факториал и для ускорения разбиваю число на две части и выполняю умножения в двух параллельных потоках.
Проблема однако в том, что когда я вычисляю факториал без потока у меня на это уходит менее 2-х минут, а когда использую параллельный поток, то время увеличивается почти до 11 минут.

Вопрос, как ускорить подсчёт?

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

Код1 (без потока). Условно на его выполнение уходит 2 минуты.
C#
1
2
3
4
5
6
7
8
9
10
public static int sum;
static void Main(string[] args)
{
sum=1;
for (int i = 2; i <= 11; i++)
  {
  sum=sum*i;
  }
Console.WriteLine("факториал="+sum);  
}
Код2 (2 параллельных потока). Условно на его выполнение уходит 9 минут.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static int sum;
static void Main(string[] args)
{
sum=1;
Thread t1 = new Thread(new ParameterizedThreadStart(ThreadProc1));
for (int i = 2; i <= 10; i=i+2)
  {
  t1.Start(i+1);
  sum=sum*i;
  }
Console.WriteLine("факториал="+sum);  
}
 
public static void ThreadProc1(Object number)
{
    int ii = (int) number;
    sum=sum*ii;
 
}
Вопрос, как ускорить подсчёт?

Тут есть ещё один казус. Если в первом коде я всего лишь подключаю один раз (не в цикле) параллельный поток, который ничего не выполняет, то код выполняется быстрее.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.05.2024, 11:50
Ответы с готовыми решениями:

параллельный поток
В Visual C++ используется функция AfxBeginThread() для паралельного патока, насколько я понял в Builder она не катит. Что посоветуете...

Как ускорить работу IJ?
Ребят, всем добрый день, я читал, что ява компилируется дольше, чем си, но у меня как-то долго... дайте пару советов, как ускорить работу:p

Как ускорить работу?
Прога ещё не доработана, сейчас интересует именно графический режим, когда нажимается клавиша 1-4 один из 4-х квадратов должен...

14
Неадекват
 Аватар для freeba
1499 / 1236 / 247
Регистрация: 02.04.2010
Сообщений: 2,807
08.05.2024, 12:06
Итерационные алгоритмы где вычисление следующего значения зависит от предыдущего - крайне плохо параллелятся, ибо затраты на синхронизацию между потоками превысят прирост от разделения по потокам.

В вашем случае можно разбить пространство перемножаемых чисел на части, каждую часть перемножить в отдельном потоке - результаты сохранить в коллекцию (не забывая про синхронизацию) и потом перемножить элементы в коллекции. Но это во первых будет жрать уйму памяти и скорее всего будет медленнее, чем перемножать в одном потоке.
0
1 / 1 / 0
Регистрация: 10.08.2012
Сообщений: 60
08.05.2024, 12:23  [ТС]
Цитата Сообщение от freeba Посмотреть сообщение
Итерационные алгоритмы где вычисление следующего значения зависит от предыдущего - крайне плохо параллелятся, ибо затраты на синхронизацию между потоками превысят прирост от разделения по потокам.

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

Добавлено через 3 минуты
Код 3. Работает условные 9 минут

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static int sum;
static void Main(string[] args)
{
sum=1;
Thread t1;
 
for (int i = 2; i <= 11; i++)
  {
  t1= new Thread(new ParameterizedThreadStart(ThreadProc1));
  start(2);
  sum=sum*i;
  }
Console.WriteLine("факториал="+sum);  
}
 
public static void ThreadProc1(Object number)
{
 
}
Добавлено через 3 минуты
Код 4. Интересный казус - работает быстрее, чем три предыдущих:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static int sum;
static void Main(string[] args)
{
sum=1;
Thread t1= new Thread(new ParameterizedThreadStart(ThreadProc1));
start(2);
 
for (int i = 2; i <= 11; i++)
  {
  sum=sum*i;
  }
Console.WriteLine("факториал="+sum);  
}
 
public static void ThreadProc1(Object number)
{
 
}
0
Эксперт .NET
 Аватар для Rius
13018 / 7584 / 1660
Регистрация: 25.05.2015
Сообщений: 23,050
Записей в блоге: 14
08.05.2024, 12:56
Приведите минимально воспроизводимый проект с проблемой . Где тут минуты, не видно. Наверное, числа должны быть очень большие и с использованием сторонних библиотек?
0
176 / 74 / 27
Регистрация: 10.11.2023
Сообщений: 199
08.05.2024, 13:05
тема названа параллельный поток
но создаете 10 потоков
Цитата Сообщение от Mitkin Посмотреть сообщение
C#
1
2
3
for (int i = 2; i <= 11; i++)
  {
  t1= new Thread(new ParameterizedThreadStart(ThreadProc1));

Цитата Сообщение от Mitkin Посмотреть сообщение
Интересный казус - работает быстрее, чем три предыдущих:
Понимаете отличие создания одного объекта от создания десяти?
так понятнее ?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static void Main(string[] args)
{
 
Thread t1;
 
for (int i = 2; i <= 11; i++)
  {
  t1= new Thread(new ParameterizedThreadStart(ThreadProc1));
  t1.Start(i);
  }
}
 
public static void ThreadProc1(Object number)
{
  var id = Thread.CurrentThread.ManagedThreadId;
 
    Console.WriteLine($"thread id: {id}");
}
0
Эксперт .NET
 Аватар для Wolfdp
3782 / 1756 / 371
Регистрация: 15.06.2012
Сообщений: 6,516
Записей в блоге: 3
08.05.2024, 14:53
Цитата Сообщение от Mitkin Посмотреть сообщение
Код2 (2 параллельных потока)
тут не два паралельных потока, а чушь.
1. стартуется один и тот же треад
2. нет ожидания
3. нет синхронизации (для подсчета факториала такой подход вообще не рабочий в плане ускорения, но в вашем случае запишется что угодно, но не результат)

"Правильное" решение
1. дробим число на блоки
2. запускает расчет частичного произведения в отдельном блоке
3. по завершению всех высчитываем произведения результатов всех потоков

Профит начинается с очень больших чисел. Считать факторил от 10 в многопотоке бессмысленно.

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
using System.Numerics;
 
var count = 50;
var n = 4;
var tasks = new Thread[n];
var results = new BigInteger?[n];
var block = Math.Max((int)Math.Ceiling((double)count / n), n);
 
for (int i = 1, index = 0; i <= count; index++)
{
    var start = i;
    var size = Math.Min(block, count + 1 - i);
    i += size;
    var parameters = (start, size, index);
    var th = new Thread(CalcBlock) { IsBackground = true };
    th.Start(parameters);
    tasks[index] = th;
}
 
for(var i = 0; i < tasks.Length; i++)
    tasks[i]?.Join();
 
var result = BigInteger.One;
foreach(var item in results.Where(x => x is not null))
    result *= item!.Value;
 
Console.WriteLine(result);
 
 
void CalcBlock(object? obj)
{ 
    if(obj is null)
        throw new ArgumentNullException(nameof(obj));
 
    (var start, var size, var index) = ((int, int, int))obj;
    BigInteger result = start;
    for (var i = start + 1; i < start + size; i++)
        result *= i;
    results[index] = result;
}
2
1 / 1 / 0
Регистрация: 10.08.2012
Сообщений: 60
08.05.2024, 23:31  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
тут не два паралельных потока, а чушь.
1. стартуется один и тот же треад
2. нет ожидания
3. нет синхронизации (для подсчета факториала такой подход вообще не рабочий в плане ускорения, но в вашем случае запишется что угодно, но не результат)

"Правильное" решение
1. дробим число на блоки
2. запускает расчет частичного произведения в отдельном блоке
3. по завершению всех высчитываем произведения результатов всех потоков

Профит начинается с очень больших чисел. Считать факторил от 10 в многопотоке бессмысленно.

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
using System.Numerics;
 
var count = 50;
var n = 4;
var tasks = new Thread[n];
var results = new BigInteger?[n];
var block = Math.Max((int)Math.Ceiling((double)count / n), n);
 
for (int i = 1, index = 0; i <= count; index++)
{
    var start = i;
    var size = Math.Min(block, count + 1 - i);
    i += size;
    var parameters = (start, size, index);
    var th = new Thread(CalcBlock) { IsBackground = true };
    th.Start(parameters);
    tasks[index] = th;
}
 
for(var i = 0; i < tasks.Length; i++)
    tasks[i]?.Join();
 
var result = BigInteger.One;
foreach(var item in results.Where(x => x is not null))
    result *= item!.Value;
 
Console.WriteLine(result);
 
 
void CalcBlock(object? obj)
{ 
    if(obj is null)
        throw new ArgumentNullException(nameof(obj));
 
    (var start, var size, var index) = ((int, int, int))obj;
    BigInteger result = start;
    for (var i = start + 1; i < start + size; i++)
        result *= i;
    results[index] = result;
}
Я пока изучаю c#. Если можно, подскажите литературу с описанием BigInteger и прочим. Числа у меня большие, тестирую на 150_000!

Добавлено через 1 минуту
Цитата Сообщение от ZeroKara Посмотреть сообщение
тема названа параллельный поток
но создаете 10 потоков




Понимаете отличие создания одного объекта от создания десяти?
так понятнее ?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static void Main(string[] args)
{
 
Thread t1;
 
for (int i = 2; i <= 11; i++)
  {
  t1= new Thread(new ParameterizedThreadStart(ThreadProc1));
  t1.Start(i);
  }
}
 
public static void ThreadProc1(Object number)
{
  var id = Thread.CurrentThread.ManagedThreadId;
 
    Console.WriteLine($"thread id: {id}");
}
Можно ли сделать один параллельный поток, но передавать ему время от времени параметр?

Добавлено через 15 минут
Цитата Сообщение от Rius Посмотреть сообщение
Приведите минимально воспроизводимый проект с проблемой . Где тут минуты, не видно. Наверное, числа должны быть очень большие и с использованием сторонних библиотек?
Я приведу фрагмент моего кода с потоками (внизу комментарии к коду). Я использовал IsAlive, но в дальнейшем попробую использовать join.

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
for (int i = 100_001; i <= 150_000; i = i + 1)
{
    i3 = -1;
    sum1 = 0;
    ii1 = i1 >> 1;
    i5 = i1;
 
    t1= new Thread(new ParameterizedThreadStart(ThreadProc1));
    t1.Start(i);
 
    while (i1 >= ii1)
    {
        i3++;
        sum = aa[i3 + i6, 0] * i + sum1;
        aa[i3, 1] = sum % j;
        sum1 = sum / j;
 
        if (i1 == ii1 && sum1 > 0)
        {
            while (t1.IsAlive == true)
            {
 
            }
            i3++;
            aa[i3, 1] = aa[i3, 1]+ sum1;
        } 
 
        i1--;
 
    }
 
    while(t1.IsAlive==true)
    {
 
    }
 
    i1 = j3;
    i6 = 0;
 
    while (aa[j3 - i1, 1] == 0)
    {
        i1--;
        i4++;
        i6++;
    }
...
}
...
public static void ThreadProc1(Object number)
{
    int ii = (int) number;
    j1 = ii1 - 1;
    j3 = i5-ii1;
    sumj1 = 0;
 
    while (j1 >= 0)
    {
        j3++;
        sumj = aa[j3 + i6, 0] * ii + sumj1;
        aa[j3, 1] = sumj % j;
        sumj1 = sumj / j;
        if (j1 == 0 && sumj1 > 0)
        {
            j3++;
            aa[j3, 1] = sumj1;
        }
      
        j1--;
 
    }
}
Я сначала подсчитываю 100_000! другой программой. Записываю это число в файл, деля на блоки. Потом из файла записываю это число в массив (число по прежнему поделено на блоки).
В цикле я делю число на две части, которые умножаю на i. Одна часть умножается в основном потоке, вторая в параллельном.
0
Эксперт .NET
 Аватар для Rius
13018 / 7584 / 1660
Регистрация: 25.05.2015
Сообщений: 23,050
Записей в блоге: 14
08.05.2024, 23:45
Можно ли сделать один параллельный поток, но передавать ему время от времени параметр?
Можно, делайте

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

Добавлено через 1 минуту
Многопоточность (очередь потоков на обслуживание)
0
1 / 1 / 0
Регистрация: 10.08.2012
Сообщений: 60
08.05.2024, 23:56  [ТС]
Цитата Сообщение от Mitkin Посмотреть сообщение
Я сначала подсчитываю 100_000! другой программой. Записываю это число в файл, деля на блоки. Потом из файла записываю это число в массив (число по прежнему поделено на блоки).
По видимому, я реализовал механизм, заложенный в BigInteger

Добавлено через 8 минут
Цитата Сообщение от Rius Посмотреть сообщение
Можно, делайте

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

Добавлено через 1 минуту
Многопоточность (очередь потоков на обслуживание)
но параметр ведь передаётся через команду start(). А второй раз у меня запускать её не получается, там возникает какая-то исключительная ситуация. Что с этим делать?
0
Эксперт .NET
 Аватар для Wolfdp
3782 / 1756 / 371
Регистрация: 15.06.2012
Сообщений: 6,516
Записей в блоге: 3
08.05.2024, 23:59
Цитата Сообщение от Mitkin Посмотреть сообщение
Если можно, подскажите литературу с описанием BigInteger и прочим.
Сбор мнений о актуальных книгах по C#

Ещё всегда можно вбить "окей гугл, что такое BigInteger в C#"

Цитата Сообщение от Mitkin Посмотреть сообщение
тестирую на 150_000!
50! уже дает значение, которое превышает int и long вместе взятые.
0
Эксперт .NET
 Аватар для Rius
13018 / 7584 / 1660
Регистрация: 25.05.2015
Сообщений: 23,050
Записей в блоге: 14
09.05.2024, 10:02
Цитата Сообщение от Mitkin Посмотреть сообщение
но параметр ведь передаётся через команду start(). А второй раз у меня запускать её не получается, там возникает какая-то исключительная ситуация. Что с этим делать?
Вот вы вроде процитировали, но не прочитали................

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

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
using System.Collections.Concurrent;
 
namespace Mitkin
{
    public class ThreadedQueue<T> : IDisposable
    {
        private Task _task;
        private CancellationTokenSource _token;
        private ConcurrentQueue<T> _queue;
        private ManualResetEventSlim _event;
        private readonly TimeSpan _waitInterval = TimeSpan.FromMilliseconds(100);
        private readonly Action<T> _action;
 
        public ThreadedQueue(Action<T> action)
        {
            this._action = action;
            this._queue = new ConcurrentQueue<T>();
            this._event = new ManualResetEventSlim(false);
            this._token = new CancellationTokenSource();
            this._task = new Task(Func, _token.Token, TaskCreationOptions.LongRunning);
            this._task.Start();
        }
 
        public void Dispose()
        {
            this._token.Cancel();
            this._task.Wait();
        }
 
        public void Enqueue(T item)
        {
            this._queue.Enqueue(item);
            this._event.Set();
        }
 
        private void Func()
        {
            var token = this._token.Token;
 
            while (!token.IsCancellationRequested)
            {
                if (this._queue.TryDequeue(out var item))
                {
                    this._action(item);
                }
                else
                {
                    try
                    {
                        if (this._event.Wait(_waitInterval, token))
                        {
                            _event.Reset();
                        }
                    }
                    catch (OperationCanceledException) { }
                }
            }
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace Mitkin
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var act = (int item) => Console.WriteLine(item);
 
            using (ThreadedQueue<int> q = new ThreadedQueue<int>(act))
            {
                for (int i = 0; i < 100; i++)
                {
                    q.Enqueue(i);
 
                    if (i % 10 == 0)
                    {
                        Thread.Sleep(1000);
                    }
                }
            }
        }
    }
}
0
Эксперт .NET
 Аватар для Wolfdp
3782 / 1756 / 371
Регистрация: 15.06.2012
Сообщений: 6,516
Записей в блоге: 3
09.05.2024, 17:02
Цитата Сообщение от Rius Посмотреть сообщение
private ManualResetEventSlim _event;
Семафор же... Reset может проскочить сразу после Set и в очереди повиснет запись. И вообще у C# есть Channel, чтобы всё это не городить.

И строго говоря, я бы ТСу советовал начать с более простых примеров многопоточности.
1
Эксперт .NET
 Аватар для Rius
13018 / 7584 / 1660
Регистрация: 25.05.2015
Сообщений: 23,050
Записей в блоге: 14
09.05.2024, 17:17
Не повиснет, цикл прокрутится и заберёт.

Добавлено через 2 минуты
Начать лучше с Литература по C# для начинающих и не только, Шилдт, главы 23-24.
0
Эксперт .NET
 Аватар для Wolfdp
3782 / 1756 / 371
Регистрация: 15.06.2012
Сообщений: 6,516
Записей в блоге: 3
09.05.2024, 18:11
Цитата Сообщение от Rius Посмотреть сообщение
Не повиснет, цикл прокрутится и заберёт.
А, блин, тут другой подход. Типа раз в 100мс чекаем очередь. Всё равно осуждаю, есть же более четкие механизмы. Ну и Disposed чекать не помешает. Если вдруг ТСу интересно, то выглядит это так

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
using System.Collections.Concurrent;
 
var act = (string item) => Console.WriteLine(item);
 
using ThreadedQueue<string> q = new(act);
for (int i = 0; i < 5; i++)
{
    q.Enqueue($"Nya! - {i}");
    await Task.Delay(TimeSpan.FromSeconds(1));
}
 
public class ThreadedQueue<T> : IDisposable
{
    private readonly Task _task;
    private readonly CancellationTokenSource _token;
    private readonly ConcurrentQueue<T> _queue;
    private readonly SemaphoreSlim _event;
    private readonly Action<T> _action;
    private bool disposed;
 
    public ThreadedQueue(Action<T> action)
    {
        disposed = false;
        _action = action;
        _queue = new ConcurrentQueue<T>();
        _event = new SemaphoreSlim(0, int.MaxValue);
        _token = new CancellationTokenSource();
        _task = Func();
    }
 
    public void Dispose()
    {
        disposed = true;
        _token.Cancel();
        _task.Wait();
    }
 
    public void Enqueue(T item)
    {
        if (disposed)
            throw new ObjectDisposedException(GetType().Name);
        _queue.Enqueue(item);
        _event.Release();
    }
 
    private async Task Func()
    {
        while (!_token.IsCancellationRequested)
        {
            try
            {
                await _event.WaitAsync(_token.Token);
                if (_queue.TryDequeue(out var item))
                    _action(item);
                else
                    throw new Exception("unexpected signal");
            }
            catch (OperationCanceledException)
            {
                if (!_token.IsCancellationRequested)
                    throw;
            }
        }
    }
}
throw new Exception("unexpected signal"); рекомендую оставлять так как обычно такие велосипеды обрастают доп-логикой, которая нет-нет, да и ломает общую картину. OperationCanceledException тоже стоит чекать что это именно наша отмена, а что-то внутри завалилось (в данном случае выглядит избыточно, но вспоминаем про велосипед и потенциально приделанный к нему ракетный двигатель).

Вообще схема рабочая в том плане, что порой нужно обеспечить очередность (скажем у нас транзакции, или какой-то объект имеет состояние, которое нужно контролировать) и таке конструкции вполне практикуются.

Цитата Сообщение от Rius Посмотреть сообщение
Начать лучше с Литература по C# для начинающих и не только, Шилдт, главы 23-24.
+1 Шилд в целом довольно хорошая книга, так что прочитать всё будет не лишним. Особенно если книжка будет по 4.5 и новее -- там не то чтобы прям радикальные изменения в базовых вещах (чего не скажешь уже про конкретные технологии, такие как asp.net), так что полученные знания плюс-минус будут актуальны.
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3378 / 2680 / 573
Регистрация: 04.09.2018
Сообщений: 8,493
Записей в блоге: 3
09.05.2024, 18:57
Mutex?

Добавлено через 4 минуты
Хотя нет, семафор тут больше подходит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.05.2024, 18:57
Помогаю со студенческими работами здесь

Как ускорить работу
Всем доброго дня! У меня существует таблица на 50 000 строк СУБД Mysql, в одной части таблицы 200 строк имеется запись &quot;-&quot;, в...

Параллельный поток glut
Создала анимацию (вращающийся куб) с помощью библиотеки &lt;GL/glut.h&gt; и окно при нажатии на Enter рандомно меняет цвет, при...

Как ускорить работу вебсайта
Основнок время при работе вебсайта это запрос к базе данный.Как работает жесткий диск: ...

Как ускорить работу ADO?
Возникла проблема следующего свойства: есть достаточно толстая процедура в MS SQL сервере, которая возвращает одну маленькую запись. ...

Как ускорить работу приложения?
У нас в компании есть приложение, для обработки входящих звонков. Написано на c# десктопом. Приложение тормозит. Какие есть...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru