Задать вопрос
boypush
@boypush
Geek

Почему начинает лагать программа запущенная в несколько копий?

У меня на форме 256 чекбоксов с именами от checkBox1 до checkBox256 и написан цикл который рандомно отмечает эти чекбоксы, функция работает по таймеру, значение таймера 50. Не спрашивайте для чего это нужно, проблема в том что когда запускаю 5-6 копий и все окна программы начинают лагать и сама система в том числе хотя значение загрузки процессора в районе 7%, ничего нигде не грузит. Увеличивал значение таймера, не помогает, все так-же лагает только медленнее, да и функционал быстрый нужен. Из-за чего такое происходит и как это исправить?
Сам код:
using System.Windows.Forms;

namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (Control control in Controls)
            {
                if (control is CheckBox)
                {
                    CheckBox checkBox = (CheckBox)control;
                    if (checkBox.Name != "autorandomcheckBox")
                    {
                        checkBox.CheckedChanged += new EventHandler((sender, e) =>
                        {
                            int index = int.Parse(checkBox.Name.Replace("checkBox", "")) - 1;
                        });

                        checkBox.Click += new EventHandler((sender, e) =>
                        {
                            int index = int.Parse(checkBox.Name.Replace("checkBox", "")) - 1;
                        });
                    }
                }
            }
        }
        private void RollRandom()
        {
            Random random = new Random();
            for (int i = 1; i <= 256; i++)
            {
                CheckBox checkBox = (CheckBox)this.Controls.Find("checkBox" + i, true)[0];
                checkBox.Checked = random.Next(2) == 1;
                if (i == 256)
                {
                    checkBox.Checked = true;
                }
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            RollRandom();
        }
        private void autorandomcheckBox_CheckedChanged(object sender, EventArgs e)
        {
            if (autorandomcheckBox.Checked)
            {
                timer1.Enabled = true;
            }
            else
            {
                timer1.Enabled = false;
            }
        } 
    }
}
  • Вопрос задан
  • 261 просмотр
Подписаться 2 Простой 5 комментариев
Решения вопроса 2
HemulGM
@HemulGM
Delphi Developer, сис. админ
Такова работа winforms и дотнета. Попробуй сделать на wpf или вообще на Делфи
64b9f3f37a651730034102.png
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Напоминает игру "Сапер".

Возможно в WinForms не эффективно реализован поиск компонентов по имени
Controls.Find("checkBox" + i, true)
Да и вообще 256 элементов - для рантайма тяжело. Наверное они слишком громоздкие
и интеллектуальные чтоб делать из них сетку объектов. Тоесть это не те WindowsGDI объекты.
Это дотнетовские объексты со своей обвязкой. С очередями сообщений и прочее.

Попробуй создать Graphics и на нем нарисовать сетку чек-боксиков. Как сапере.
И мышко-клик обрабатывай. Я думаю это решит проблему.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы