Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/22: Рейтинг темы: голосов - 22, средняя оценка - 4.50
 Аватар для DrMcSheen
62 / 63 / 3
Регистрация: 25.05.2009
Сообщений: 520

Различается ли написание программ в C++ Builder для одно-двухъядерных процессоров?

21.12.2009, 07:14. Показов 4837. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Например, в текущей программе предстоит перебор 10^12 вариантов с небольшими вычислениями.
Будет ли прога по умолчанию просчитываться двумя ядрами проца или что-то дописать надо?
Я просто не в курсе архитектуры процессора.
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.12.2009, 07:14
Ответы с готовыми решениями:

Написание программ для многоядерных процессоров
Привет. у вас на сайте я видел такую статью, но теперь когда она мне понадобилась, не могу ее найти. так вот: как писать программы для...

У двухъядерных процессоров на каждое ядро своя частота или общая?
Здравствуйте! Я где-то слышал что у двух ядерных процессоров тактовая частота в два раза больше чем у обыкновенных! На каждый ядер по своей...

Написание простейших программ для С++
В общем такая беда. В универе дали задачу, на сессию. Написать пару программ. Но проблема в том, что нет никакого опыта в написании :C...

29
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.12.2009, 07:17
Тема интересна, благодарю за её поднятие.
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
21.12.2009, 09:36
Для того, чтобы программа обрабатывалась одновременно несколькими процессорами, нужно просто сделать несколько потоков в программе. Винда потом сама будет решать каким процессором нужно обрабатывать какой поток, и мы этим не занимаемся.
1
 Аватар для DrMcSheen
62 / 63 / 3
Регистрация: 25.05.2009
Сообщений: 520
21.12.2009, 09:44  [ТС]
Цитата Сообщение от Otaka Посмотреть сообщение
нужно просто сделать несколько потоков в программе
блин, я так и думал
1
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.12.2009, 09:49
А как правильно планировать потоки? Чтоб они друг друга не держали и реально работали быстрее, чем один. Какие ни будь примеры/рекомендации есть?
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
21.12.2009, 10:32
У меня в этом особого опыта нет. Но логика подсказывает, но нужно стараться, чтобы потоки обрабатывали разные(не пересекающиеся) данные и не использовали глобальных переменных. Очень желательно, чтобы обработкой визуального интерфейса занимался только главный поток программы, а остальные только лишь отправляли ему сообщения.

Можешь почитать еще про OpenMP. Гугли по теме "распараллеливание алгоритмов" "распараллеливание программ" итд.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.12.2009, 11:18
От этого толку мало. Зачем мне вообще полностью независимые потоки, если я хочу быстро решить одну задачу? Как спланировать параллельную работу потоков, чтобы они обменивались данными, но не держали друг друга?

Добавлено через 13 минут
Цитата Сообщение от Otaka Посмотреть сообщение
а остальные только лишь отправляли ему сообщения
Нафига? Вторичные потоки не только получать сообщения не должны, но по-моему лучше, если они их и отправлять явно не будут. А связь только переменными и объектами.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
21.12.2009, 15:10
Цитата Сообщение от taras atavin Посмотреть сообщение
От этого толку мало. Зачем мне вообще полностью независимые потоки, если я хочу быстро решить одну задачу? Как спланировать параллельную работу потоков, чтобы они обменивались данными, но не держали друг друга?
При распараллеливании любые точки соприкосновения потоков должны делаться через синхронизацию. И тут действует вполне очевидное правило: накладные расходы на синхронизацию не должны портить весь бонус от распараллеливания. Если "я хочу", то можно сделать и 10 потоков, которые тесно работают друг с другом, но тогда почти наверняка появятся ситуации, что в каком-то месте нужна синхронизация, например, 5 потоков, при этом получится так, что 4 потока тупо ждут, пока завершится 5-й

Otaka писал всё правильно. Логика при распараллеливании должна быть такой, что ветви исполнения делаются максимально независимыми и по возможности м меньшим количеством точек соприкосновения. Ну и, желательно, расчитать, чтобы до точки синхронизации потоки работали примерно одинаковое время, чтобы не было простоев. Говоря "ветви" я имею в виде не обязательно поток. Это может быть и отдельный процесс, который может исполняться в том числе и на другой машине

Добавлено через 50 секунд
> и не использовали глобальных переменных

Более правильно добавить слово "одновременно"
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
22.12.2009, 06:17
Цитата Сообщение от Evg Посмотреть сообщение
Более правильно добавить слово "одновременно"
А если необходимо одновременное чтение глобала в обоих потоках? Или это источник тормозов?

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

Добавлено через 1 час 53 минуты
Минимум связей между подзадачами - общее правило декомпозиции, не зависящее от того, к чему оно отнесено: модулям, подпрограммам, потокам для однопроцессорного одноядерного компа или чему то ещё. Но и одно данное можно ждать из второго потока процентов 90 всего времени, что приведёт к тормозам. Так вот, меня интересует, как надо планировать именно потоки, чтоб таких ситуаций не было.
0
 Аватар для DrMcSheen
62 / 63 / 3
Регистрация: 25.05.2009
Сообщений: 520
22.12.2009, 07:20  [ТС]
В качестве эксперимента написал 5 строк кода типа "возми лом, подмети плац" - просто нагрузить проц. ProcessExplorer показывает, что с этим кодом работают оба проца, правда по 50%. Повысил приоритет процесса, стало - первый проц 75%, второй 50%. А общая загрузка почему-то всё равно 50%.
Ничо не понял.

Добавлено через 7 минут
Если выключаю второй проц, первый грузится на 97% и наоборот.
1
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
22.12.2009, 07:30
Очень интересную заковыку ты нашел.
0
 Аватар для DrMcSheen
62 / 63 / 3
Регистрация: 25.05.2009
Сообщений: 520
22.12.2009, 08:19  [ТС]
А после создания отдельного потока с таким же кодом оба проца грузятся по 98%
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
22.12.2009, 09:53
Цитата Сообщение от taras atavin Посмотреть сообщение
А если необходимо одновременное чтение глобала в обоих потоках? Или это источник тормозов?
Для этого есть mutex (аналог семафора, но для потоков, т.к. у потоков есть общий ресурс - глобальная память). Mutex сам по себе медленным не является. Если Mutex используется только для того, чтобы прочитать-записать глобал - в этом ничего страшного нет. Но в реальной жизни такая операция как правило просто так не нужна. Если есть общий глобал, то как правило один поток ждёт, пока он изменится или что-то типа того, и тормоза возникают именно из-за ожиданий.

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

Цитата Сообщение от taras atavin Посмотреть сообщение
Так вот, меня интересует, как надо планировать именно потоки, чтоб таких ситуаций не было.
Условно говоря, тебе надо сделать векторное сложение. Т.е. имеются массивы A, B и C длинной по миллион элементов и для i от нуля до миллиона надо выполнить операцию A[i]=B[i]+C[i]. Ты можешь разбить эту операцию на два куска: один складывает первые 500 тыщ элементов, другой складывает вторые 500 тыщ элементов. По времени они работают примерно одинаково (т.к. количество элементов одинаковое). Поэтому это можно разбить на два потока. А если ты сделаешь куски 100 тыщ и 900 тыщ, то время выполнения определяется временем отработки куска в 900 тыщ, т.е. составит всего 90% от времени нераспараллеленой задачи (против теоретических 50%).

Однако разбивать по 500 тыщ можно по разному. Можно так, что первые 500 тыщ элементов и последние 500 тыщ элементов. А можно чётные и нечётные. Во втором случае получится так, что оба потока при параллельной работе лезут в одни и те же страницы памяти (т.е. по очень близким адресам). Если такая задача будет работать на многопроцессорной (не путать процессорное ядро и процессор) машине и потоки лягут на разные процессоры, то такой вариант скорее всего будет работать медленнее, чем не распараллеленный. Потому что когда два процессора работают с одними и теми же страницами памяти, то начинает сильно тормозить система когерентности кэша. Когда один процессор пишет в память, то данные оседают в кеше, который физически расположен внутри процессора, а поэтому процессор должен "уведомить" другие процессоры, что какая-то запись в памяти на текущий момент на самом деле не лежит в памяти, а лежит в моём кэше.

Цитата Сообщение от DrMcSheen Посмотреть сообщение
В качестве эксперимента написал 5 строк кода типа "возми лом, подмети плац" - просто нагрузить проц. ProcessExplorer показывает, что с этим кодом работают оба проца, правда по 50%. Повысил приоритет процесса, стало - первый проц 75%, второй 50%. А общая загрузка почему-то всё равно 50%.
Ничо не понял.
Аналогично, не видя конкретного примера сказать что-то сложно. На форуме как-то присутсвовал один орёл, который написал многопоточность следующим образом: запустил один поток, ждёт его завершения, когда он закончился, запустил второй поток и опять ждёт его завершения. После чего сказал "многопоточность ацтой" и ушёл.
1
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
22.12.2009, 10:02
Цитата Сообщение от Evg Посмотреть сообщение
Для этого есть mutex (аналог семафора, но для потоков, т.к. у потоков есть общий ресурс - глобальная память). Mutex сам по себе медленным не является. Если Mutex используется только для того, чтобы прочитать-записать глобал - в этом ничего страшного нет. Но в реальной жизни такая операция как правило просто так не нужна. Если есть общий глобал, то как правило один поток ждёт, пока он изменится или что-то типа того, и тормоза возникают именно из-за ожиданий.
Один заранее записал, два других пытаются одновременно (но намного позже записи) читать. Что плохого?

Добавлено через 5 минут
Цитата Сообщение от Evg Посмотреть сообщение
не путать процессорное ядро и процессор
Разницу между многопроцессорными и многоядерными компами я знаю с тех пор, как первый раз услышал про многоядерный камень, так как про многопроцессорные компы знаю ещё с девяностых.
0
 Аватар для DrMcSheen
62 / 63 / 3
Регистрация: 25.05.2009
Сообщений: 520
22.12.2009, 10:03  [ТС]
Вот пример:
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h" 
  #include <process.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
DWORD WINAPI Thread (LPVOID pParam);
int a, b, i, t;
HANDLE hTread;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 hTread = CreateThread(NULL, 0, Thread, NULL, NULL, NULL);
 CloseHandle (hTread);
 for (i=0; i<10000000000;i++)
        {
        t = rand ()%10000;
        t = t * 12345;
        if (t==0) a++;
        }
}
//---------------------------------------------------------------------------
 
DWORD WINAPI Thread (LPVOID)
{
 for (a=0; a<10000000000;a++)
        {
        b = rand ()%10000;
        b = b * 12345;
        if (b==0) Form1->MyEvent();
        }
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::MyEvent()
{
 t ++;
}
А как остановить поток, когда он уже не нужен?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
22.12.2009, 10:04
Цитата Сообщение от Evg Посмотреть сообщение
На форуме как-то присутсвовал один орёл, который написал многопоточность следующим образом: запустил один поток, ждёт его завершения, когда он закончился, запустил второй поток и опять ждёт его завершения.
Такая действительно отстой.
0
 Аватар для MrAndrey_ka
79 / 79 / 20
Регистрация: 13.05.2009
Сообщений: 537
Записей в блоге: 1
22.12.2009, 12:48
DrMcSheen, вопрос поднял конечно сложный, он относится к проэктированию систем, и есль целые книги поднимающие вопрос многопоточности и по каким принцыпам и в каких ситуациях какой лучше выбрать.
В твоей ситуации 2 потока на 2-ух ядрах результат дадут быстрее, напиши 2 одинаковых потока, а вот что они будут вычислять роздели, например по четности (один поток считает операции с четным номером а второй нет), хотя и такой подход не идеален.......
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
22.12.2009, 20:15
DrMcSheen, а ты уверен, что rand реально паралеллится и внутри себя не содержит mutex? Мало ли, может там есть какая-то глобальная таблица, доступ к которой делается через синхронизацию внутри функции rand

> Один заранее записал, два других пытаются одновременно (но намного позже записи) читать. Что плохого?

Ты точно понимаешь, о чём я говорю? Я говорю о флаговой переменной, и потоки ждут изменения её значения (т.е. это точка синхронизации)

> Разницу между многопроцессорными и многоядерными компами я знаю с тех пор, как первый раз услышал про многоядерный камень, так как про многопроцессорные компы знаю ещё с девяностых.

Охотно поверю. А всю остальную мысль ты понял?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
23.12.2009, 07:14
Цитата Сообщение от Evg Посмотреть сообщение
Условно говоря, тебе надо сделать векторное сложение. Т.е. имеются массивы A, B и C длинной по миллион элементов и для i от нуля до миллиона надо выполнить операцию A[i]=B[i]+C[i].
Эй'си. Векторная сумма у меня есть. Размер вектора 17000 элементов. Но это подзадача в рамках задачи решения системы уравнений методом Гаусса и там одно слагаемое должно умножаться на коэффициент: A[I]+=B[I]*K. Где взять K, кроме как с помощью межпотоковой связи? А отдельно задача векторной суммы с более, чем четырьмя элементами обычно не возникает.
Цитата Сообщение от MrAndrey_ka Посмотреть сообщение
вопрос поднял конечно сложный, он относится к проэктированию систем, и есль целые книги поднимающие вопрос многопоточности и по каким принцыпам и в каких ситуациях какой лучше выбрать.
Лично мене именно это и нужно, но как они называются, кем написаны, кем изданы, где, когда? В электронном виде есть? Где можно скачать?
Цитата Сообщение от Evg Посмотреть сообщение
Я говорю о флаговой переменной, и потоки ждут изменения её значения (т.е. это точка синхронизации)
Это я понимаю. Я не понимаю, зачем это использовать и держать чтение, если другой не поток не пишет, а тоже читает.
Цитата Сообщение от Evg Посмотреть сообщение
. А всю остальную мысль ты понял?
То, что в многопроце надо синхронизировать кэш я знаю ещё с девяностых, но во-первых, если данные записаны заранее один раз, то что мешает записать в основную память, а во-вторых, многопроцы - это в первую очередь супера, а пэкашки чаще многоядерные. Где кэш находится? Внутри камня. Где находится ядро, выполняющее второй поток? Внутри того же камня. Зачем нужна синхронизация кэша?

Добавлено через 1 час 14 минут
Как приладе опознать число ядер? Я не требую, чтобы она самостоятельно выполнила реальный тест оборудования - пусть запрашивает через систему, если нет другого удобного пути, но сама, без участия пользователя. Как это сделать под болэндом и как под мелкософт девелопмент студио?

Добавлено через 1 час 23 минуты
Цитата Сообщение от Otaka Посмотреть сообщение
Для того, чтобы программа обрабатывалась одновременно несколькими процессорами, нужно просто сделать несколько потоков в программе.
Как это сделать в общем виде для переменного от сеанса к сеансу числа ядер?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
23.12.2009, 10:42
Цитата Сообщение от taras atavin Посмотреть сообщение
Эй'си. Векторная сумма у меня есть. Размер вектора 17000 элементов. Но это подзадача в рамках задачи решения системы уравнений методом Гаусса и там одно слагаемое должно умножаться на коэффициент: A[I]+=B[I]*K. Где взять K, кроме как с помощью межпотоковой связи?
Скажем так, говорить конструктивно можно только на конкретном примере. Я в математике не силён, а потому не знаю, что такое метод гаусса.

Цитата Сообщение от taras atavin Посмотреть сообщение
А отдельно задача векторной суммы с более, чем четырьмя элементами обычно не возникает.
Векторную сумму я привёл как простой пример, где на пальцах можно пояснить, что тут можно распараллелить.

Цитата Сообщение от taras atavin Посмотреть сообщение
Лично мене именно это и нужно, но как они называются, кем написаны, кем изданы, где, когда? В электронном виде есть? Где можно скачать?
Видишь ли, конкретные книги тебе может дать человек, который вплотную и серьёзно занимается данной проблемой. Есть ли такие люди на форуме - вопрос. А ты в гугле не пробовал икать?

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

Цитата Сообщение от taras atavin Посмотреть сообщение
То, что в многопроце надо синхронизировать кэш я знаю ещё с девяностых, но во-первых, если данные записаны заранее один раз, то что мешает записать в основную память, а во-вторых, многопроцы - это в первую очередь супера, а пэкашки чаще многоядерные. Где кэш находится? Внутри камня. Где находится ядро, выполняющее второй поток? Внутри того же камня. Зачем нужна синхронизация кэша?
Я попытался показать, что даже на простейшем примере, где математически вроде бы всё просто, а реально получается далеко не так, как ожидалось. В ответ услышал лишь гордое заявление, что дескать я знаю, чем отличаются два ядра и два процессора (хотя речь шла совсем не об этом). К тому же форум читаешь не один ты, и для кого-то сей момент был бы не прозрачным

Цитата Сообщение от taras atavin Посмотреть сообщение
Как приладе опознать число ядер? Я не требую, чтобы она самостоятельно выполнила реальный тест оборудования - пусть запрашивает через систему, если нет другого удобного пути, но сама, без участия пользователя. Как это сделать под болэндом и как под мелкософт девелопмент студио?
В реальной жизни серьёзные счётные задачи ручками мало кто параллелит. Используют автоматические или полуавтоматические средства. Автоматическим средствам является построение распараллеленного кода компилятором. Т.е. ты пишешь программу, при компиляции используешь специальную опцию, а компилятор сам анализирует код программы и сам строит код по распараллеливанию. Тут есть куча тонкостей по поводу того, как правильно писать программы, чтобы автоматические средства смогли правильно распараллелить. В полуавтоматическом режиме используются средства наподобие Open MP - программист пишет программу но через #pragm'ы явно подсвечивает места, которые нужно распараллелить. Далее компилятор с учётом этих подсказок распараллеливает код. Здесь так же миллион своих тонкостей.

Оба метода используют библиотеки run-time поддержки, интерфейсы которых являются высокоуровневыми, но реализация на каждой конкретной платформе строго заточена под конкретную архитектуру. Туда же входит и выяснение количества процессоров. Поддерживаются ли эти средства компиляторами под винду - я не знаю.

"Как выяснить количество процессоров под виндой" - вопрос надо ставить именно в такой форме, потому что это делается средствами ОС (в нашем случае через WinApi), а потому в борланде и микрософте это будет выглядеть одинаково

Цитата Сообщение от taras atavin Посмотреть сообщение
Как это сделать в общем виде для переменного от сеанса к сеансу числа ядер?
Грубо говоря, написать программу, в начале которой задаётся в переменную N число процессоров (ядер), а внутри динамически распределять потоки в зависимости от N
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.12.2009, 10:42
Помогаю со студенческими работами здесь

Написание программ для сервисов Теория
Здравствуйте, возник вопрос, я изучаю qt и стало интересно, как пишутся программы клиенты для различных сервисов, например инстаграмма или...

Написание компилятора для С++ программ в блокноте
Приветствую. Такой вопрос, можно ли написать bat файл который являлся бы компилятором для С++(нормальные среды разработки у меня есть,...

Написание программ на заказ для компьютеров и микроконтроллеров
Программист (удаленный работник) оказывает (принимает заявки на разработку и написание программ на заказ) услуги: 1. Написание программ...

Написание программ для OS Andriod 4. С чего начать?
Почитал много статей про написание программ под смартфоны на Андроиде и слегка запутался. 1) Я так понял основной язык для написания...

Лучший инсталлятор для программ на Borland C++ Builder 6.
Какой инсталятор лучше всего использовать для программ написанных на Borland C++ Builder 6. Спасибо.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Программный отбор элементов справочника Номенклатура по группе 1С
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор под наименованию группы (на. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор элементов справочника Сотрудники по перечислениям 1С
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru