大家好,
背景资料:我有一个应用程序,在那里我不断命令发送到微控制器通过串行端口和处理来自串口的反应。我获取和设置不同的控制性能,在此过程中的主要形式。
当我开始这样做的主要过程,我不能点击主窗体上的任何按钮,或选中/取消选中任何复选框,等等等等。我想这是因为一切都在单个线程上运行吗?
所以,现在,我创建了一个单独的线程来执行这个过程中,但我仍然需要更新和从主窗体上的控件的信息。
我的问题是:我需要创建一个"代表"的每一个动作的功能,我在主窗体上的控制上执行,这样做是有一些其他方式。有很多很多东西,我的主要形式,所以它会涉及到创造了大量的委托功能。
任何帮助将不胜感激。
感谢
新手安德烈
下面是一些代码来说明:
protected void start_tests() //this method runs in its own thread
{
string input = string.Empty;
timer1.Enabled = false; // this would need delegate?
if (ResetFlag == true) //I guess this would need delegate
{
reset_selectedindex(); //delegate allready created
checkedListBox1.SelectedIndex = 0; //this would need delegate
ResetFlag = false; //I think this would need delegate
}
progressBar1.Maximum = checkedListBox1.CheckedItems.Count; //this needs delegate
progressBar1.Value = 0; //this needs delegate
while (checkedListBox1_selectedindex() < checkedListBox1_Items_Count()) //delegates used here
{
if (checkedListBox1.GetItemCheckState(checkedListBox1.SelectedIndex) == CheckState.Checked) //delegates needed here
{
UpdateText(checkedListBox1.SelectedItem.ToString() + "\n", UpdateType.TXdata,Color.Lime); //delegates needed here
progressBar1.Value++; //delegate needed here ....etc etc etc
try
{
show_message_box(checkedListBox1.SelectedIndex,PrePostCommand.precommand);
input = ExecCommand("TESTSEQ" + Convert.ToDecimal(checkedListBox1.SelectedIndex).ToString().PadLeft(2, '0') + "\r", 3000, "No responese from OVPT");
if (input.Contains("REQUEST"))
{
if (DialogResult.Yes == show_message_box(checkedListBox1.SelectedIndex,PrePostCommand.postcommand))
{
UpdateText("TEST:" + Convert.ToDecimal(checkedListBox1.SelectedIndex).ToString().PadLeft(2, '0') + " - " + checkedListBox1.SelectedItem.ToString() + "\r\n", UpdateType.MessageData, Color.Lime);
UpdateText("TEST PASS.", UpdateType.MessageData, Color.Lime);
}
else
{
UpdateText("TEST:" + Convert.ToDecimal(checkedListBox1.SelectedIndex).ToString().PadLeft(2, '0') + " - " + checkedListBox1.SelectedItem.ToString() + "\r\n", UpdateType.MessageData, Color.Red);
UpdateText("TEST FAIL.", UpdateType.MessageData, Color.Lime);
TestPass = false;
}
}
if (input.Contains("FAIL"))
{
UpdateText("TEST:" + Convert.ToDecimal(checkedListBox1.SelectedIndex).ToString().PadLeft(2, '0') + " - " + checkedListBox1.SelectedItem.ToString() + "\r\n", UpdateType.MessageData, Color.Red);
UpdateText(input, UpdateType.MessageData, Color.Red);
TestPass = false;
}
if (input.Contains("PASS"))
{
UpdateText("TEST:" + Convert.ToDecimal(checkedListBox1.SelectedIndex).ToString().PadLeft(2, '0') + " - " + checkedListBox1.SelectedItem.ToString() + "\r\n", UpdateType.MessageData, Color.Lime);
UpdateText(input, UpdateType.MessageData, Color.Lime);
}
}
catch (Exception e)
{
UpdateText(e.Message, UpdateType.MessageData,Color.Red);
TestPass = false;
}
}
if (checkedListBox1.SelectedIndex == (checkedListBox1.Items.Count - 1))
{
break;
}
checkedListBox1.SelectedIndex++;
}
if (TestPass == false)
{
label_Result.Text = "FAILED!!";
label_Result.BackColor = Color.Red;
label_Result.ImageIndex = 0;
}
else
{
label_Result.Text = "PASS!!";
label_Result.BackColor = Color.Lime;
label_Result.ImageIndex = 1;
}
if (checkBox3.Checked == true)
{
Thread.Sleep(100);
button2_Click_1(this, EventArgs.Empty);
Thread.Sleep(20);
//start_tests();
}
else
{
timer1.Enabled = true;
oThread.Abort();
}
}