Поток в программной форме - C#
Формулировка задачи:
Есть такая ситуация:
Есть 1 форма, из неё открываем другую, там вводим числа. На кнопке есть обработчик события (вторая форма кстати создана программно). В этом событии создаётся progressbar и помещается на вторую форму, далее происходят вычисления и на основе их заполняется picturebox из первой формы. Вторая форма закрывается.
По крайней мере так должно было быть. Но так происходит только при отладке программы в пошаговом режиме. И то если правильно расставить точки остановки. А при обычной работе всего этого picturebox не изменяется.
Вот код обработчика кнопки второй формы:
FormAsk - вторая форма
paintLabyrint - заполняет pictureBox
ProgressBar pb = new ProgressBar();
pb.Parent = FormAsk;
pb.Bounds = new Rectangle((this.Width - 287) / 2, (this.Height - 33) / 2, 287, 33);
n = Convert.ToInt32(TBox1.Text);
m = Convert.ToInt32(TBox2.Text);
Thread create = new Thread(delegate()
{
if (FormAsk.IsHandleCreated)
{
if (pb.InvokeRequired)
pb.Invoke((CustomDelegate)delegate()
{
pb.Visible = true;
pb.Value = 0;
//progressBar1.Minimum = 0;
pb.Maximum = 4 * m * n;
});
else
{
pb.Visible = true;
pb.Value = 0;
// progressBar1.Minimum = 0;
pb.Maximum = 4 * m * n;
}
}
else
MessageBox.Show("Это не хорошо");
labyrint = new int[n + 1, m + 1, 3];
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
for (int k = 0; k < 3; k++)
{
if (k == 0)
labyrint[i, j, k] = 0;
else
labyrint[i, j, k] = 1;
if (pb.InvokeRequired)
pb.Invoke((CustomDelegate)delegate() { pb.Value++; });
else
pb.Value++;
}
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
if (i == 0 && j == 0)
{
labyrint[i, j, 0] = 1;
entersetted = true;
}
if (i == 0 && j == m - 1)
{
labyrint[i, j, 0] = 2;
exitsetted = true;
}
if (i == 0)
labyrint[i, j, 2] = 0;
if (j == 0)
labyrint[i, j, 1] = 0;
if (i == n - 1)
labyrint[i + 1, j, 2] = 0;
if (j == m - 1)
labyrint[i, j + 1, 1] = 0;
if (pb.InvokeRequired)
pb.Invoke((CustomDelegate)delegate() { pb.Value++; });
else
pb.Value++;
}
if (pictureBox1.InvokeRequired)
{
pictureBox1.Invoke((CustomDelegate)delegate() { paintLabyrint(false); });
}
else
paintLabyrint(false);
});
create.Start();
FormAsk.Close();
}Решение задачи: «Поток в программной форме»
textual
Листинг программы
(e.Argument as Form).Close();