Быстродействие потока, Invoke - C#
Формулировка задачи:
добрый день, задача следующая, обрабатываю изображение, что бы форма не зависала, делаю в отдельном потоке. И я заметил что в новом потоке эта задача решается раз 10 дольше, чем без потока, возможно мне показалось? или почему так? может какие то приоритеты у них есть? или мне это все кажется?
и еще такой вопрос: у меня програсс бар крутиться пока поток работает(metroProgressSpinner), и чтобы его остановить приходиться инвок делать, т.к. к форме нельзя из нового потока обратиться, а в pictureBoxe картинку поменять получается прям из потока, хотя по логике там тоже инвок нужен, почему так?
Bitmap first; Bitmap Second; private void clear() { Color c; for (int i = 0; i < first.Width; i++) for (int j = 0; j < first.Height; j++) { c = first.GetPixel(i, j); if (c.R < Convert.ToInt32(metroTextBox1.Text) && c.G < Convert.ToInt32(metroTextBox1.Text) && c.B < Convert.ToInt32(metroTextBox1.Text)) { c = Color.FromArgb(0, 0, 0); } Second.SetPixel(i, j, c); } pictureBox2.Image = Second; Invoke(new STOP(stop)); } public delegate void STOP(); public void stop() { metroProgressSpinner1.Visible = false; metroProgressSpinner1.Enabled = false; }
Решение задачи: «Быстродействие потока, Invoke»
textual
Листинг программы
private int level; private void clear() { Color c; for (int i = 0; i < w1.Width; i++) for (int j = 0; j < w1.Height; j++) { c = w1[i, j]; if (c.R < level && c.G < level && c.B < level) { c = Color.FromArgb(0, 0, 0); } w2.SetPixel(new Point(i, j), c.R, c.G, c.B); } Invoke(new STOP(stop)); } public delegate void STOP(); public void stop() { w1.Dispose(); w2.Dispose(); pictureBox1.Image = first; pictureBox2.Image = Second; metroProgressSpinner1.Visible = false; metroProgressSpinner1.Enabled = false; } ImageWrapper w1; ImageWrapper w2; private void metroListView1_SelectedIndexChanged(object sender, EventArgs e) { try { first = new Bitmap(files[metroListView1.SelectedIndices[0]]); Second = new Bitmap(first.Width, first.Height); w1 = new ImageWrapper(first); w2 = new ImageWrapper(Second); metroProgressSpinner1.Visible = true; metroProgressSpinner1.Enabled = true; level = Convert.ToInt32(metroTextBox1.Text); Task a = new Task(clear); a.Start(); } catch { } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д