Создание массива занимает много времени - C#
Формулировка задачи:
Здравствуйте. Нужен совет.
В процессе написания некой программы, возникла надобность в создании больших массивов объектов типа Label. В итоге программа очень долго работает над созданием массива размером 4096 ячеек.
Массив большей размерности вообще отказывается создавать. Виснет. Как можно ускорить работу программы? Мне в голову пока пришёл способ распараллелить задачу на несколько потоков с тем, чтобы каждый поток создавал фрагмент общего массива, а затем сливать их в одно целое. Может быть есть ещё варианты?
Спасибо.
Label[] labels = new Label[4096];
Решение задачи: «Создание массива занимает много времени»
textual
Листинг программы
using System.Drawing; using System.Windows.Forms; namespace WindowsFormsApplicationTest2 { public partial class Form1 : Form { private const int Rows = 64; private const int Columns = 64; private readonly Pixel[,] pixels; public Form1() { InitializeComponent(); // Создаём пиксели pixels = new Pixel[Rows,Columns]; for ( int i = 0; i < Rows; i++ ) { for ( int j = 0; j < Columns; j++ ) { pixels[ i, j ] = new Pixel( i, j ); } } // Подгоняем размеры поля для отображения pictureBoxLED.Width = Rows * Pixel.Width; pictureBoxLED.Height = Columns * Pixel.Width; } private void PictureBoxLedPaint( object sender, PaintEventArgs e ) { // Перерисовываем пиксели for ( int i = 0; i < Rows; i++ ) { for ( int j = 0; j < Columns; j++ ) { pixels[ i, j ].Draw( e.Graphics ); } } } private void PictureBoxLedMouseClick( object sender, MouseEventArgs e ) { // Обновляем отмеченность пикселей for ( int i = 0; i < Rows; i++ ) { for ( int j = 0; j < Columns; j++ ) { pixels[ i, j ].MouseClick( e ); } } // Перерисовываем pictureBoxLED.Invalidate(); } private void PictureBoxLedMouseMove( object sender, MouseEventArgs e ) { // Отмечаем при зажатой клавише if ( e.Button == MouseButtons.Left || e.Button == MouseButtons.Right ) { PictureBoxLedMouseClick( sender, e ); } } } public class Pixel { /// <summary> /// Отображаемая ширина пикселя /// </summary> public const int Width = 6; /// <summary> /// Ограничивающий прямоугольник /// </summary> private Rectangle boundingRectangle; /// <summary> /// Пиксель по номеру строки и столбца /// </summary> /// <param name = "row">Строка</param> /// <param name = "columns">Столбец</param> public Pixel( int row, int columns ) { boundingRectangle = new Rectangle( row * Width, columns * Width, Width, Width ); } /// <summary> /// Номер строки и столбц пикселя /// </summary> public Point PixelLocation { get { return new Point( boundingRectangle.X / Width, boundingRectangle.Y / Width ); } } /// <summary> /// Определяет, горит ли пиксел /// </summary> public bool IsChecked { get; private set; } /// <summary> /// Отрисовка пикселя /// </summary> /// <param name = "g">Контекст для отрисовки</param> public void Draw( Graphics g ) { if ( IsChecked ) { g.FillRectangle( Brushes.Black, boundingRectangle ); } else { g.DrawRectangle( Pens.LightGray, boundingRectangle ); } } /// <summary> /// Событие при клике мышью /// </summary> /// <param name = "e">Аргументы события клика</param> public void MouseClick( MouseEventArgs e ) { if ( boundingRectangle.Contains( e.Location ) ) { IsChecked = e.Button == MouseButtons.Left; } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д