Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626

Процесс висит - окна нет

10.11.2019, 20:25. Показов 3327. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Написал небольшое приложение. Идут вычисления, затем выводятся в окно, через секунду заново. Естественно использовал для этого цикл. При запуске окно не отображается, то есть программа работает, если поставить точку останова, во время работы то видно, что вычисления идут, ничего не зависает, пересчитывает каждую секунду, вот только в диспетчере задач процесс висит не где приложения все, а ниже, в разделе background processes. Если убрать цикл, то программа нормально запускается и отрабатывает ровно один раз. При этом и окно есть и процесс появляется где надо. В wpf нельзя циклы использовать или что?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.11.2019, 20:25
Ответы с готовыми решениями:

Процесс висит в памяти
Пишу многопоточное приложение. Закрываю форму программы, а процесс остается висеть в памяти (((, почему так???

Процесс висит после закрытия
Есть небольшой проект, который почему-то не выгружается из процессов после закрытия. Из потоков там есть только БД (но это не точно), но...

Висит процесс после запуска в XE 5
В Дэлфи 7 программа закрывается нормально. Этот же проект запущенный из-под RAD ХЕ 5 после закрытия висит в памяти. Приходиться убивать из...

39
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.11.2019, 07:22
Студворк — интернет-сервис помощи студентам
Chizel, вы используете очень медленнее методы: удаление/добавление в list, поиск по листу и т.д.
Вместо листа надо использовать матрицу.
Также нужно сохранять список штампов матрицы для определения конца игры.
Чуть по позже накидаю примеры кода.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.11.2019, 08:12
Chizel, вам нужен в Модели класс для хранения штампа поля Жизни.
Проще всего использовать булеву матрицу.

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

Нужен метод шага с клонированием. Создаёт следующий штамп поля. Если жизнь есть в крайних клетках, то штамп расширяется в этом направлении. Копируются значения всех клеток согласно правил игры.

Попробуем накидать сейчас код.
Пишу со смарта - могут быть мелкие ошибки.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.11.2019, 09:04
Начальная реализация
Будет время - продолжу
На смарте очень долго получается
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
public class LiveMatrix : IEquatable<LiveMatrix>
{
    private readonly  bool [,] matrix;
    public int Rows {get;}
    public int Columns {get;}
 
    private int hashCode = -8305258042;
    public override int GetHashCode() => hashCode;
    public bool Equals(LiveMatrix other)
    {
         if(hashCode != other.hashCode)
               return false;
         if(Rows != other.Rows || Columns != other. Columns)
               return false;
 
         for(int row = 0; row < Rows; row++)
         for(int column = 0; column < Columns; column++)
               if(! matrix [row, column] ^ other.matrix [row, column])
                     return false;
          return true;
     }
 
    public override bool Equals(object other)
    {
        if(other is LiveMatrix oth)
             return Equals (oth);
        return false;
     }
 
    public LiveMatrix(int rows, int columns)
    {
        Rows = rows;
        Columns = columns;
        matrix = new bool [Rows, Columns];
        hashCode ^= Rows.GetHashCode();
        hashCode ^= Columns.GetHashCode();
     }
 
    public bool IsLiveTop {get; private set;}
    public bool IsLiveBottom {get; private set;}
    public bool IsLiveLeft {get; private set;}
    public bool IsLiveRight {get; private set;}
 
     public void SetCell(int row, int column)
     {
           if(matrix [row, column])
               return;
 
           matrix [row, column] = true;
           if (row==0)
               IsLiveTop = true;
           if (column==0)
               IsLiveLeft = true;
           if (row==Rows-1)
               IsLiveBottom = true;
           if (row==Columns-1)
               IsLiveRight = true;
 
          hashCode ^= row.GetHashCode();
          hashCode ^= column.GetHashCode();
        
      }
}
0
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
13.11.2019, 01:40  [ТС]
Элд Хасп, о, новые темы для меня, пойду изучать что такое хеши
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
13.11.2019, 02:25
Chizel, хеш код используется для быстрой выборки, сравнения объектов.
Сначала сравниваются хеш коды объектов, если они равны, то сравниваются уже непосредственно сами объекты.
На этом построены хеш-списки, словари, методов работы с множествами и т.д.
Так как для условия конца игры надо проверять текущую матрицу со всеми ранее созданными, то быстрое сравнение очень ускорит приложение.

Правила для хеш-кода.
1) хеш-код должен считаться очень быстро
2) для одинаковых объектов (для тех которым метод Equals возвращает true) должен возвращать один и тот же код.
3) для разных объектов должен стремиться возвращать разные коды, но может вернуть и одинаковые.

Для матрицы я специально анализ не делал - нет компа.
Но вроде я правильно написал.
Если есть возможность - проверьте для нескольких примеров.
0
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
13.11.2019, 05:04
Chizel, а зачем вечный цикл?

Добавлено через 11 минут
Перечитал тему, извините поторопился с вопросом. Я не совсем понял концепцию, но можно внести такие изменения для оптимизаций.
Вот тут передавать не string, a bool или enum
C#
1
2
3
4
5
6
7
8
9
10
11
 private int StillAlive(Point check, string newOrOld)
        {
            int i;
            if (newOrOld == "new") i = 0;
            else i = -1;
            foreach (Point p in Gameboard)
            {
                if (p.X > check.X - 2 && p.X < check.X + 2 && p.Y > check.Y - 2 && p.Y < check.Y + 2) i++;
            }
            return i;
        }
Заменить Linq на циклы, ибо linq медл в 10 раз примерно.
C#
1
2
3
4
5
6
7
private void NewBorn(Point check)
        {
            bool b = true;
            if (Gameboard.FirstOrDefault(p => p.X == check.X && p.Y == check.Y) != null) b = false;
            if (newPoints.FirstOrDefault(p => p.X == check.X && p.Y == check.Y) != null) b = false;
            if (b && StillAlive(check, "new") > 2 ) newPoints.Add(check);
        }
Не понял зачем TimeInterval = Stopwatch.StartNew(); использутеся.
Если для отображения времени в игре, то лучше будет сделать таймер.
А если это какая-то костылеобразная пауза, то проще через await Task.Delay()

А так же я бы отказался от foreach в пользу for с индексом.

P.s может быть в вашем случае будет полезен Parralel for(если массив большой, то потоки ускорят процесс)

И как выше писал ув. Элд Хасп делать проверку по хешам, а уже в случае не совпадения делать фулл проверку по элементам.
0
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
13.11.2019, 07:47  [ТС]
Элд Хасп, я, если честно, так до сих пор и не понял, что это и как работает. Вернее понял, что по хешу можно быстро сравнить два объекта, в данном случае матрицу, но зачем? Она итак каждый ход меняться будет априори, клетки с каждым ходом умирают и рождаются.
Defences, а что не понятно с концепцией, я объясню.
Переделаю стринг на бул.
Неужели в 10 раз? Тогда переделаю на циклы for, обязательно, сравню скорость работы.
Stopwatch считает время выполнения одной итерации цикла, почему это костыль?
Parallel for почитаю, спасибо.
по хешам выше писал, нет смысла сравнивать, каждый ход будет на поле ситуация меняться
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
13.11.2019, 09:17
Chizel, если не надо сравнивать - тогда конечно всё упрощается.
Просто по указанной вами ссылке в программе игры было сравнение с целью определения конца игры.
Без этого хеш не будет нужен.

Добавлено через 7 минут
Chizel, что касается string, то если нет явной в нём необходимости его лучшее не использовать.
Создание каждого экземпляра string это запрос на выделение памяти.
string неизменяемый тип. Поэтому под каждое изменение надо создавать новый экземпляр. А старый отправляется в мусор.
Большое количество таких экземпляров (а у вас из десятки тысяч) могут очень сильно "подвешивать" приложение.

StringBuilder в этом отношении конечно лучше. Но вам потом всё равно придется получать его string представление.
Количество мусора уменьшиться, но лучше всё равно отказаться от строкового представления.

Chizel, у вас игра бесконечная? Конец игры не надо определять?
0
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
13.11.2019, 09:28
Chizel,

00:00:00.0016628
00:00:00.0000941


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 var arr = new int[100000];
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = i;
            }
 
            var sw = new Stopwatch();
            sw.Start();
 
            int a = arr.FirstOrDefault(p => p == 95000);
            Console.WriteLine(sw.Elapsed);
 
            sw.Restart();
 
            for (int i = 0; i < arr.Length; i++)
            {
                if (arr[i] == 95000)
                    break;
            }
            Console.WriteLine(sw.Elapsed);
            Console.ReadLine();
0
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
13.11.2019, 17:41  [ТС]
Элд Хасп, да, все будет бесконечно работать. Сегодня протестирую, насколько по времени будет ускорение. К 500-му ходу у меня около 20000 живых клеток, считает около 200 секунд один ход.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
13.11.2019, 19:49
Chizel, а как вы поле расширяете?
Когда на краю поля появляется жизнь, то увеличиваете размер поля?

Добавлено через 1 минуту
Chizel, на смарте такое кодить ужасно долго.
Если завтра будет время - попробую сделать на основе матрицы.
0
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
13.11.2019, 21:14
Chizel, это не прикол?

200 сек?? Киньте сайты где можно почитать за игру, я сделаю для демонстрации.
0
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
13.11.2019, 21:52  [ТС]
Defences, я выше кидал ссылку на википедию, игра жизнь можно загуглить, это старая математическая штука, суть такова. Есть поле с клетками пустыми, как шахматная доска, на поле ставятся фишки - это живые клетки и начинается игра. Каждый ход вычисляется, если вокруг живой клетки нет других живых или есть только одна, то она помечается, как умершая, если вокруг четыре или более, то тоже погибает от перенаселения. Если вокруг какой-то пустой клетки три и более живых, то эта пустая становится живой, типо новорожденная. Так и играется, за один ход помечается клетки, которые погибают, затем те, которые рождаются, затем единомоментно картина на поле меняется, то есть убираются мёртвые и добавляются живые и считаем все заново. Реализуете если, то для проверки даю координаты начальной фигуры, она долго играющая и постоянно растёт, а не отмирает к сотому ходу. (0,0) (-1,-1) (-1,0), (0,1), (1,-1), (2,-1). Само поле безграничное.

Элд Хасп, а никак не расширяю, у меня ведь не матрица. Я когда обдумывал, как реализовать, чтобы массив сам расширялся ничего придумать не смог, поэтому решил хранить не поле с клетками, а список с клетками, тогда не надо думать о границах массива, ибо все операции будут на координатной сетке, а она бесконечна.

Заменил linq на циклы for и string на bool, к 150 ходу этой фигуры у меня 1733 живых клетки, время 1266 мс в старой версии, в новой 1125 мс, чёт какой-то мизерный выигрыш. Снял скрины, выложить завтра могу, если интересно

Добавлено через 5 минут
Для тестов ещё можно три в ряд положить фишки - это бесконечная фигура, которая на каждом ходе будет поворачиваться на 90 градусов, типо, сначала так - затем так | потом опять - и до бесконечности, я баги именно на такой вылавливал, очень удобно
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
14.11.2019, 05:37
Chizel, переход с LINQ на циклы в списках ничего не даст.
В любом случае будет применяться линейный поиск.
0
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
14.11.2019, 06:49
Chizel, нашел вот такую реализацию WPF. Возможно вы сможете что-то взять себе оттуда
Вложения
Тип файла: zip sergey_vaulin-gameoflife.zip (53.6 Кб, 1 просмотров)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
14.11.2019, 07:41
Chizel, если использовать список "живых" точек, то надо поменять или хеш-список или бинарный поиск.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
15.11.2019, 12:05
Chizel, попробую со смарта накидать метод для создания штампов булевых матриц с "Жизнью".
Отладить сам не смогу - нет компа.
Проверьте сами и сообщите результат.

Метод проверки жизни на границах.
Если есть жизнь - возвращает расширенную матрицу
Иначе - исходную.
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
public static bool[,] CheckBorder(bool[,] matrix)
{
    int rows = matrix.GetLength(0)-1;
    int cols = matrix.GetLength(1)-1;
 
    // Определение жизни на краях
    bool isTop = false;
    bool isBottom = false;
    for(int col = 0; col <= cols && !(isTop && isBottom); col++)
    {
        isTop |= matrix[0, col];
        isBottom |= matrix[rows, col];
    }
    bool isLeft = false;
    bool isRight = false;
    for(int row = 0; row <= rows && !(isLeft && isRight); row++)
    {
        isLeft |= matrix[row, 0];
        isRight |= matrix[row, cols];
    }
 
// Если нигде на границах нет жизни, то возврат
// исходной матрицы
     if (!(isTop || isBottom || isLeft || isRight))
              return matrix;
 
    //Параметры расширенной матрицы
     int rowsN = rows + (isTop ? 1 : 0) + (isBottom ? 1 : 0)+1;
     int colsN = cols + (isLeft ? 1 : 0) + (isRight ? 1 : 0)+1;
 
     int rowOffs = isTop ? 1 : 0;
     int colOffs = isLeft ? 1 : 0;
 
// Создание расширенной матрицы 
// и копирование Жизни
     bool [,] matr = new bool [rowsN, colsN];
    for(int row = 0; row <= rows; row++)
    for(int col = 0; col <= cols; col++)
        matr[row+rowOffs, col+colOffs] = matrix [row, col];
 
     
     return matr;
}
Метод создания матрицы следующего шага
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
public static bool[,] NextStepLive(bool[,] matrix)
{
    int rows = matrix.GetLength(0);
    int cols = matrix.GetLength(1);
 
    // Создание матрицы нового штампа
     bool [,] matr = new bool [rows--, cols--];
 
      // Проверка на создание жизни на краях
       for(int col = 1; col < cols; col++)
       {
             matr[0, col] = matrix[1, col-1]
                                     && matrix[1, col]
                                      && matrix[1, col+1];
             matr[rows, col] = matrix[rows-1, col-1]
                                     && matrix[rows-1, col]
                                      && matrix[rows-1, col+1];
        }
       for(int row = 1; row < rows; row++)
       {
             matr[row, 0] = matrix[row-1, 1]
                                     && matrix[row, 1]
                                      && matrix[row+1,1];
             matr[row, cols] = matrix[row-1, cols-1]
                                     && matrix[row, cols-1]
                                      && matrix[row+1, cols-1];
        }
 
        // Проверка на жизнь в центре матрицы
    for(int row = 1; row < rows-1; row++)
    for(int col = 1; col < cols-1; col++)
    { int count = matrix[row-1, col-1] ? 1 : 0
                       + matrix[row-1, col] ? 1 : 0 
                       + matrix[row-1, col+1] ? 1 : 0 
                       + matrix[row, col-1] ? 1 : 0 
                       + matrix[row, col+1] ? 1 : 0 
                       + matrix[row+1, col-1] ? 1 : 0 
                       + matrix[row+1, col] ? 1 : 0 
                       + matrix[row+1, col+1] ? 1 : 0 ;
      matr[row, col] = count == 3
                                  || (count == 2 && matrix[row, col]);
    }
    return matr;
}
0
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
21.11.2019, 17:38  [ТС]
Элд Хасп, долго не мог добраться из-за работы
Соседние клетки по диагонали надо тоже учитывать, всего восемь клеток вокруг каждой.
Правильно ли я понял, что в вашей реализации мы будем проверять вообще каждую клетку матрицы? Разве это рационально? Или я чего то недопонял?
Не могли бы вы накидать общую концепцию, как вы это видете, алгоритм, так сказать, чтобы я при отладке понимал, что работает верно, а что не так?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
21.11.2019, 19:16
Chizel, клетки по диагонали тоже проверяются.

Проверяются все ячейки матрицы. Быстрее ли это чем проверка списка....
Зависит от заполненности матрицы.
Проверка ячеек массива многократно быстрее чем поиск и проверка элементов списка.
Но список может быть много короче массива.
Без экспериментальных проверок сравнения скорости обоих методов не обойтись.

Даже если работа со списком окажется быстрее, нужно будет вместо List использовать HashSet или Dictionary.

Добавлено через 22 минуты
Общая концепция алгоритма.

На каждом шаге формируется штамп матрицы Жизни.
Значение ячеек где есть Жизнь = true.

Шаг начинается с метода CheckBorder - проверки Жизни на границах матрицы. Если где-то на краю есть жизнь, то создаётся новая расширенная матрица и в неё копируются значения. Если Жизнь сверху или слева, то копирование со смещением.

В следующий метод NextStepLive передаётся матрица полученая из предыдущего метода. В этой матрице граничные клетки всегда "мертвые". Поэтому они не проверяются. Создаётся матрица с такими же размерами и в ней создаётся/копируется Жизнь согласно состоянию полученной матрицы и правил Игры.

Полученная матрица является следующим штампом. Изменять его нельзя. Он поступает как исходные данные для следующего шага. А также отправляется в View. В котором асинхронно по штампу создаётся рисунок в типе ImageSource. И уже этот тип в основном потоке отображается.

Тоесть, кроме основного потока, будет ещё два. В одном генерируются штампы. В другом по ним создаются рисунки.

На каждом шаге создаётся одна, иногда две матрицы. Это генерирует мусор. Я не знаю насколько он может тормозить приложение. Это надо проверить экспериментально.
Если будет тормозить, то можно сделать пул матриц. И отработавшие штампы отправлять в него и потом использовать их вместо создания новых. Это усложняет алгоритм, но значительно уменьшит мусор.

Добавлено через 7 минут
Пропустил в описании алгоритма.
Граничные клетки всегда "мертвые", поэтому на Жизнь они не проверяются. Но возникнуть жизнь в них может. И проверка на рождение Жизни производится. Жизнь на первой краю линии может возникнуть только если есть жизнь во всех соседних трёх ячейках из второй линии.

Так как условия жизни на краях и в центре разные, то для ускорения проверок используются разные циклы с разными проверками:
- Вертикальные края. Только на рождение
- Горизонтальные края. Только на рождение
- Некрайние ячейки. На рождение и сохранение жизни.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
22.11.2019, 07:08
Chizel, ещё есть один нюанс при работе со штампами.
Алгоритм очень легко параллелить.
Так как штамп создаётся один раз и он неизменяемый, то для работы с ним можно создать пул потоков.
Разбить матрицу на регионы и каждый регион формировать в отдельной задаче в индивидуальном потоке.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.11.2019, 07:08

В диспетчере задач висит странный процесс
BF8CA43E-FE7D-4FAE-8186-ADF9BB27AFF3.exe (C:\Users\Zerriz\AppData\Local\Microsoft\Macromed\Flash Player\Updater Startup Utility) пробовал...

После окончания работы висит процесс
После окончания работы висит процесс 1сv8.exe*32. И бог с ним, но в таком случае 1С не дает пользователю запустить 1с еще раз. Ну это...

Отловить процесс из-за которого висит сервер
Здравствуйте! Имеется сервер на Ubuntu. На нем работает сайт. Имеется доступ по ssh. Переодически сервер зависает. Сайт не отвечает, а в...

Delphi 7 and Windows 10: после закрытия висит процесс
Здравствуйте. После закрытия Delphi висит процесс, который немножко памяти и всё. Всё компилится и работает. В чём может быть причина?

После лечения Eset висит запущенный процесс notepad.exe
Поставила eset, просканировала компьютер полностью, было обнаружено несколько угроз, eset сказал, что все вычистил, но осталось странное...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru