Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690

TreeView. Как ускорить построение дерева

27.09.2018, 10:33. Показов 4329. Ответов 20

Студворк — интернет-сервис помощи студентам
Источник данных: - БД MSAccess;
Таблица - > 1 000 000 записей;
Поля таблицы см. скрин;

Количество корневых узлов - ~100 штук;
Количество уровней - не ограничено;

Размер БД - 55 Мб;

Код

Кликните здесь для просмотра всего текста
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
    public partial class Form1 : Form
    {
        DataTable dt;
        OleDbConnection connection;
        OleDbDataAdapter adapter;
        OleDbCommandBuilder commandBuilder;
 
 
        static string catBD = @"z:\vs\csharp\prb\313\01_pr\01_pr\01_pr\Tree View_313.01.00.accdb";
        string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}", catBD);
 
        // string sql = "SELECT ID, PrID, NodeName FROM TableTreeView_Template";
 
        string sql = "SELECT ID, PrID, NodeName FROM TableTreeView";
 
        public Form1()
        {
            InitializeComponent();
 
        }
 
        private void Form2_Load(object sender, EventArgs e)
        {
            button1.PerformClick();
        }
 
 
        private void button1_Click_1(object sender, EventArgs e)
        {
            LoadTreeView();
        }
 
 
        // Загрузка древовидной структуры
        private void LoadTreeView()
        {
 
 
            try
            {
                connection = new OleDbConnection(connectionString);
                connection.Open();
 
                // cmd1 = new OleDbCommand(sql, connection);
                // adapter = new OleDbDataAdapter(cmd1);
                adapter = new OleDbDataAdapter(sql, connection);
 
                commandBuilder = new OleDbCommandBuilder(adapter);
 
                // На основании DataTable
                dt = new DataTable();
                adapter.Fill(dt);
 
                // dataGridView1.DataSource = dt;
                LoadNodes(treeView1, dt); // Вызываем функцию добавления узлов
 
            }
 
            catch
            {
                MessageBox.Show("Ошибка!\n\n", "Ошибка SQL", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
 
            finally
            {
                connection.Close();
            }
        }
 
 
        // Метод добавления узлов
        private void LoadNodes(TreeView TreeView, DataTable DataTable1)
        {
            TreeView.Nodes.Clear(); // Очищаем дерево
            for (int i = 0; i < DataTable1.Rows.Count; i++)
            {
                DataRow row = DataTable1.Rows[i];
                if (row["PrID"].ToString() == 0.ToString()) // Если в поле IDParent нет значения
                {
                    TreeNode node = new TreeNode();
 
                    node.Tag = row["ID"];
                    node.Text = row["NodeName"].ToString();
 
                    node.ToolTipText = "Узел"; // подсказка узла
 
                    treeView1.Nodes.Add(node); // Добавляем элемент, как узел
 
                    LoadSubNodes(node, DataTable1); // Вызываем функцию добавления подузлов к этому узлу
                }
            }
        }
 
        // Метод добавления подузлов
        private void LoadSubNodes(TreeNode ParentNode, DataTable DataTable1)
        {
            // Условие фильтрации строк: выборка всех записей таблицы с IDParent = ID добавленного узла
            string FilterExpression = "PrID = {0}";
            DataRow[] Rows = DataTable1.Select(string.Format(FilterExpression, ParentNode.Tag));
 
            foreach (DataRow row in Rows)
            {
                TreeNode ChildNode = new TreeNode();
 
                ChildNode.Tag = row["ID"];
                ChildNode.Text = row["NodeName"].ToString();
 
                ChildNode.ToolTipText = "Подузел"; // подсказка
 
                ParentNode.Nodes.Add(ChildNode);
                LoadSubNodes(ChildNode, DataTable1);
            }
        }



Запускаю отладку.
Файл решения (*.exe) начинает расти более 500Мб. и долго запускается.
Результата я так и не дождался.

Вопрос.
Как оптимизировать код загрузки дерева?
Миниатюры
TreeView. Как ускорить построение дерева  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.09.2018, 10:33
Ответы с готовыми решениями:

TreeView: построение дерева на основе данных из БД Access
Такова проблема. Есть 3 таблицы в БД. 1-компания, 2 - отдел, 3-пользователь в 1-компания столбцы - id_firma, name_firma в 2 - отдел...

TreeView: построение дерева на основе данных из БД Oracle 11g xe
Добрый вечер.Столкнулся с такой проблемой.У меня есть три таблицы Partners P_ID ALIAS REGION INDIVIDUALS ID_FL P_ID ...

Опросник. Создание дерева зависимостей в treeView, сохранение дерева в XML, построение дерева в treeView из XML
Всем доброго времени суток. Тема является продолжением вот этой темы. Создаю 2ю, так как там был другой вопрос, который скорее...

20
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
27.09.2018, 11:06  [ТС]
TreeView
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
27.09.2018, 11:12
Цитата Сообщение от Soft17 Посмотреть сообщение
Как оптимизировать код загрузки дерева?
Загружайте не сразу все дерево, а один-два уровня.
При раскрытии узла подгружайте из базы еще один-два дочерних уровня.
При закрытии узла элементы можно удалять для экономии памяти.
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
27.09.2018, 11:37  [ТС]
TreeView
Цитата Сообщение от kolorotur Посмотреть сообщение
Загружайте не сразу все дерево, а один-два уровня.
Буду пробовать.
Это делать запросом или кодом (сделать счётчик какой-нибудь)?
Или кодом и запросом?

Цитата Сообщение от kolorotur Посмотреть сообщение
При закрытии узла элементы можно удалять для экономии памяти.
Может вам не сложно показать как это сделать?
Я так понимаю, что нужно удалять дочернии узлы...
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
27.09.2018, 15:37
Цитата Сообщение от Soft17 Посмотреть сообщение
Это делать запросом или кодом (сделать счётчик какой-нибудь)?
Я бы на вашем месте выбросил прямую работу с базой и использовал что-нибудь вроде Entity Framework.
Во многом жизнь станет проще.

Цитата Сообщение от Soft17 Посмотреть сообщение
Может вам не сложно показать как это сделать?
У вас какая Студия?
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
27.09.2018, 15:51  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
У вас какая Студия?
VS 2017
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
27.09.2018, 16:43
Лучший ответ Сообщение было отмечено Soft17 как решение

Решение

Цитата Сообщение от Soft17 Посмотреть сообщение
VS 2017
Вот, гляньте прицепленный проект.
В нем подключение к базе производится с помощью Entity Framework.

В файле app.config в 24-й строке пропишите путь к вашему файлу Access:
XML
1
connectionString="Provider=Microsoft.ACE.OleDB.12.0;Data source=SampleDb.accdb"
Вот там, где Data source вместо SampleDb.accdb укажите путь к вашему файлу.

В папке Model лежит класс DbEntry, который дублирует (или пытается дублировать) структуру вашей таблицы — на каждую строку в таблице будет создаваться этот экземпляр.
В файле SampleContext лежит код, где каждое свойство класса привязывается к колонке в таблице.

Обработку ошибок не делал — это допилите сами, там лишь простой пример асинхронной подгрузки каждого уровня.
Вложения
Тип файла: zip DbTreeView.zip (13.0 Кб, 17 просмотров)
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
27.09.2018, 17:12  [ТС]
kolorotur,
Огромное спасибо.
Буду разбираться.

У меня выдаёт ошибки.
Как их устранить?

SampleContext.OnModelCreating(DbModelBui lder) : не найден метод пригодный для переопределения.
"DbContext" не содержит конструктор, который принимает аргументы 1.
"SampleContext" не содержит определения для "Database" и не удалось найти метод расширения "Database", принимающий тип "SampleContext" в качестве первого аргумента (возможно, пропущена
директива using или ссылка на сборку).
"SampleContext": тип, использованный в операторе using, должен иметь неявное преобразование в System.IDisposable.
Имя "Database" не существует в текущем контексте.
Не удалось найти тип или имя пространства имен "DbContext" (возможно, отсутствует директива using или ссылка на сборку).
Не удалось найти тип или имя пространства имен "DbModelBuilder" (возможно, отсутствует директива using или ссылка на сборку).
Не удалось найти тип или имя пространства имен "DbSeto" (возможно, отсутствует директива using или ссылка на сборку).
Тип или имя пространства имен "Entity" не существует в пространстве имен "System.Data" (возможно, отсутствует ссылка на сборку).
Тип или имя пространства имен "Entity" не существует в пространстве имен "System.Data" (возможно, отсутствует ссылка на сборку).
Миниатюры
TreeView. Как ускорить построение дерева  
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
27.09.2018, 17:18
Цитата Сообщение от Soft17 Посмотреть сообщение
У меня выдаёт ошибки.
Как их устранить?
Восстановите NuGet-пакеты.
В настройках студии в категории NuGet Package Manager отметьте галочку чтобы он автоматом восстанавливал зависимости при построении проекта.
Tools -> Options, дальше как на картинке.
Миниатюры
TreeView. Как ускорить построение дерева  
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
27.09.2018, 17:34  [ТС]
kolorotur,
Вроде всё нормально
Не могли бы вы ещё раз посмотреть, что не так.

При первом запуске окно выскакивало. (см. скрин)
Я нажал "ок", т.е. выбрал первый пункт.
Миниатюры
TreeView. Как ускорить построение дерева   TreeView. Как ускорить построение дерева   TreeView. Как ускорить построение дерева  

0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
27.09.2018, 17:42
Первая картинка: выберите второй пункт. Да и вообще, не забывайте обновлять студию
Как вариант, понизьте целевую платформу проекта до 4.6, но тогда возможно придется переустановить зависимости под ту же версию.

Вторая картинка: вверху на желтоватом фоне справа должна быть кнопка "Восстановить".
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
27.09.2018, 20:20  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
понизьте целевую платформу проекта до 4.6
Понизил.
Ошибки пропали.

Запускаю проект.
Открывается пустое окно.

Прописал путь к БД
App.config
XML
1
<add name="SampleDb" connectionString="Provider=Microsoft.ACE.OleDB.12.0;Data source=c:\test\csharp\vs\db\Tree View_01.accdb" providerName="JetEntityFrameworkProvider"/>
Прописал имя таблицы (если я правильно понял)
SampleContext.cs
C#
1
2
entity.ToTable("TableTreeView_min");
entity.HasKey(e => e.Id);
В чём может быть проблема?
Прилагаю базу "Tree View_01.zip" (может пригодится)
Миниатюры
TreeView. Как ускорить построение дерева   TreeView. Как ускорить построение дерева   TreeView. Как ускорить построение дерева  

Вложения
Тип файла: zip Tree View_01.zip (8.76 Мб, 8 просмотров)
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
27.09.2018, 21:42
Цитата Сообщение от Soft17 Посмотреть сообщение
В чём может быть проблема?
Стесняюсь спросить: а в таблице-то есть что-нибудь?

Цитата Сообщение от Soft17 Посмотреть сообщение
Прилагаю базу "Tree View_01.zip" (может пригодится)
Сейчас под рукой акцесса нет, чтобы проверить, но завтра гляну. Если до этого так не разберемся.

Добавлено через 39 минут
Глянул.
Вы в таблице для колонки с Id родителя используете значение 0 если родителя нет.
Подход неправильный, надо использовать null, но если иначе никак, то в 24-й строке передавайте не null, а 0.
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
27.09.2018, 21:52  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Стесняюсь спросить: а в таблице-то есть что-нибудь?
)
Да вроде есть... Поэтому и базу приложил.. на случай если у меня "затмение"...
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
27.09.2018, 22:00
Soft17, исправьте таблицу или передавайте 0.
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
27.09.2018, 22:18  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
исправьте таблицу или передавайте 0.
Сделал так:
C#
1
var roots = await GetEntriesAsync(0);
Ошибок нет. Открывается пустая форма

Сделал так: в базе данных заменил на "0" на пустое значение.
Код работает. Дерево строится
недостаток: несколько медленно происходит загрузка большой таблицы (5-10 с.)
Хотя вряд ли такое большое дерево будет использоваться, но всё же...

PS
Цитата Сообщение от kolorotur Посмотреть сообщение
Я бы на вашем месте выбросил прямую работу с базой и использовал что-нибудь вроде Entity Framework.
Во многом жизнь станет проще.
Давно смотрю в сторону "Entity Framework", но всё как-то руки не доходили...

На счёт "проще",
Как-то "проще" не бросается в глаза, глядя на то как "Entity Framework" строит дерево....
Для меня это что-то космическое...
Но буду разбираться

1. "Entity Framework" это наиболее эффективная на текущий момент технология работы с базой данных?
2. Вы бы рекомендовали освоить работу с "Entity Framework"?
Тот способ работы с базой данных, который я применил в вопросе уже не практикуется?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
27.09.2018, 22:23
Цитата Сообщение от Soft17 Посмотреть сообщение
Ошибок нет. Открывается пустая форма
Сделал так: в базе данных заменил на "0" на пустое значение.
Код работает. Дерево строится
Как-то у вас наоборот все получается...

Цитата Сообщение от Soft17 Посмотреть сообщение
недостаток: несколько медленно происходит загрузка большой таблицы (5-10 с.)
Это недостаток работы с акцессом (или с используемым драйвером — попробуйте другой).

Для пробы создал таблицу в PostgreSQL и заполнил ее десятью миллионами узлов — выборка уровня производится за 1 миллисекунду.

Цитата Сообщение от Soft17 Посмотреть сообщение
Как-то "проще" не бросается в глаза, глядя на то как "Entity Framework" строит дерево.
Оно сложнее кажется только потому, что каждый уровень подгружается отдельно.
Попробуйте реализовать все это "голым" ADO.Net — ужаснетесь.

Цитата Сообщение от Soft17 Посмотреть сообщение
1. "Entity Framework" это наиболее эффективная на текущий момент технология работы с базой данных?
В чем-то, но не во всем.
Если надо выгружать/загружать большие объемы данных, то она не сильно подходит.
Если надо работать по принципу "выгрузил сущность, модифицировал, загрузил снова", то работает идеально.

Цитата Сообщение от Soft17 Посмотреть сообщение
2. Вы бы рекомендовали освоить работу с "Entity Framework"?
Да.

Добавлено через 1 минуту
Цитата Сообщение от Soft17 Посмотреть сообщение
Тот способ работы с базой данных, который я применил в вопросе уже не практикуется?
Слишком низкоуровнево для поставленной задачи, на мой взгляд.
Но и никто не запрещает, конечно.
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
28.09.2018, 08:45  [ТС]
kolorotur,
А как сделать кнопки для перемещения узлов "вверх" ("вниз") по дереву?
Я так понимаю, что в таблице нужно сделать отдельное поле для сортировки?
Миниатюры
TreeView. Как ускорить построение дерева  
Вложения
Тип файла: zip Tree View_02.zip (20.3 Кб, 5 просмотров)
0
burning1ife
 Аватар для kenny69
1466 / 1287 / 294
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
29.09.2018, 06:38
Цитата Сообщение от Soft17 Посмотреть сообщение
недостаток: несколько медленно происходит загрузка большой таблицы
В EF используйте AsNoTracking(), чтобы получать данные быстрее, если же не собираетесь их изменять.
Плюс можно получать не все поля из таблицы а только нужные с помощью Select
По сути здесь нужно только Id, Name и кол-во потомков (чтобы показать кол-во и/или добавить + для раскрытия списка).

Еще один вариант использовать Dapper, у него лучшая производительность по сравнению с EF.
У EF много плюшек вроде кэширования и т.д., но это оставляет след на производительности и если они не используются, то лучше их отключать или использовать другую ORM вроде Dapper.

В Dapper будет выглядеть так:
XML
1
2
3
4
 <connectionStrings>
    <add name="MyConnectionString"
    connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Nodes.accdb;Persist Security Info=False;"  />
  </connectionStrings>
C#
1
2
3
4
5
6
7
8
 
 var  connectionString =  ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;//читаем строку подключения из конфига
 using (IDbConnection db = new OleDbConnection(connectionString))
{
       var sqlQuery = "SELECT Id, Name... etc WHERE ParentId= @ParentId;";//текст запроса к бд
       var nodes =await db.QueryAsync<NodeDto>(sqlQuery, new {ParentId=parentId});//NodeDto класс с полями Id, Name etc..
 
}
Добавлено через 3 минуты

Не по теме:

kolorotur, кстати только сейчас узнал, что EF есть провайдер для работы с Access. Но судя по тому, что у них асинхронность "ненастоящая", то так себе реализация :)

1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.09.2018, 14:46
Цитата Сообщение от kenny69 Посмотреть сообщение
"SELECT Id, Name... etc WHERE ParentId= @ParentId;";//текст запроса к бд
Если в коде прописывать запросы, то лучше вообще использовать ADO.NET — быстрее всего будет
А так там проблемы с производительностью из-за самого Access — как я писал выше, если поменять базу на PostgreSQL, то запросы отрабатывают за 1мс с таблицей в десять лямов записей. Если же дергать данные из Access из таблицы с одним миллионом, то запрос выполняется за секунду-полторы.
Может, конечно, в этом провайдер виноват или кривые индексы в аксессе.

Цитата Сообщение от kenny69 Посмотреть сообщение
только сейчас узнал, что EF есть провайдер для работы с Access.
Я тоже узнал только когда пример взялся делать!

Цитата Сообщение от Soft17 Посмотреть сообщение
А как сделать кнопки для перемещения узлов "вверх" ("вниз") по дереву?
Меняйте положение выбранного узла и обновляйте значение колонки сортировки в прицепленном к нему объекте.

Цитата Сообщение от Soft17 Посмотреть сообщение
Я так понимаю, что в таблице нужно сделать отдельное поле для сортировки?
Да.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.09.2018, 14:46
Помогаю со студенческими работами здесь

Построение иерарх. дерева на основе существующей БД. Как ускорить вывод данных.
Есть БД в которой заложен вывод данных в иерархическом виде (1С) т.е. там есть ID и ParentID (вхождение в ветвь). Мне нужно вывести...

TreeView. Как вывести построение дерева файлов и папок в отдельный класс?
Имеется форма &quot;Form1.cs&quot; На ней &quot;treeView1&quot;. Я создаю дерево в &quot;Form1.cs&quot; следующим кодом: #region *** TreeView Создание *** ...

Построение дерева TreeView из XML
Здравствуйте! Уважаемые, подскажите пожалуйста как из такого XML-файла построить дерево в TreeView с помощью стандартных средств Делфи. ...

Динамическое построение дерева в TreeView по заданной структуре
Доброго дня. Подскажите пожалуйста , как правильно построить дерево в этой ситуации. Имеется структура и её объявление typedef struct ...

Парсинг файлов формата IFC и построение дерева TreeView на основе полученных данных
Всем здрасти! У меня ужасное положение. Мне нужно сдавать проект. Проект парсит файлы формата IFC и строит тривьюху по распарсенным...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru