我知道这是我之前问过的问题的转贴……
...但是我的后续问题没有得到回答,所以我再次发布以寻求有关新问题的帮助。我会在这里重复介绍。谢谢你的放纵。
我对 c#、线程和表单还是很陌生。我写了一个小数据采集程序。它有两个线程:一个传感器轮询/记录线程和一个可以绘制传感器数据图表的主 UI 线程。当用户单击“开始记录”按钮时,它会不断轮询传感器(通过虚拟 COM 端口),将响应写入文件,使用一些基本轮询统计信息(每秒轮询次数)更新主窗体。如果用户单击了“监视器”按钮,它会打开一个图表表单,并且轮询线程开始调用一个将传感器值添加到图表的方法。该程序运行良好,但我发现如果我打开了多个图表(以便我可以实时查看多个传感器),图表更新会变得零星或停止,只有焦点窗口会顺利更新。
所以我有了制作图表线程的“聪明”想法,认为这将提供多个 UI 循环(因此我可以与每个图表进行交互)并且会在多个图表表单上生成漂亮的平滑图表。以下是简化代码;例如,在这里,图表线程由轮询线程启动,而不是在用户单击“监控”按钮时启动。
问题是委托从未被执行。主窗体上的统计信息正在很好地更新,图表窗体已显示,但没有响应,当我使用鼠标时出现“等待”光标。非常感谢您的建议。谢谢。
namespace WindowsFormsApplication2
{
public partial class Main_Form : Form
{
delegate void UpdateUIStatsDelegate(string update);
UpdateUIStatsDelegate update_stats_delegate;
static BackgroundWorker polling_thread = new BackgroundWorker();
static BackgroundWorker charting_thread = new BackgroundWorker();
public static Chart_Form chart_form;
public Main_Form()
{
Thread.CurrentThread.Name = "main";
update_stats_delegate = new UpdateUIStatsDelegate(update_stats);
polling_thread.DoWork += polling_thread_DoWork;
charting_thread.DoWork += charting_thread_start;
}
private void start_polling_Click(object sender, EventArgs e)
{
// start polling thread
polling_thread.RunWorkerAsync();
// start charting plotting thread
charting_thread.RunWorkerAsync();
}
private void polling_thread_DoWork(object sender, DoWorkEventArgs e)
{
string sensor_values;
Thread.CurrentThread.Name = "polling";
while (true)
{
sensor_values = poll_the_sensors_and_collect_the_responses();
chart_form.BeginInvoke(chart_form.update_chart_delegate, new object[] { sensor_values });
pps = compute_polling_performance();
BeginInvoke(update_stats_delegate, new object[] { pps.ToString("00") });
}
}
private string poll_the_sensors_and_collect_the_responses()
{
send_command_to_sensor(sensor_id, command_to_return_current_readings);
return read_sensor_response(sensor_id);
}
private void update_stats(string stat)
{
pollings_per_second.Text = stat;
}
private void charting_thread_start(object sender, DoWorkEventArgs e)
{
Thread.CurrentThread.Name = "charting";
chart_form = new Chart_Form();
chart_form.Show();
while (charting_is_active) { }
}
}
public partial class Chart_Form : Form
{
public delegate void UpdateChartDelegate(string sensor_values);
public UpdateChartDelegate update_chart_delegate;
public Chart_Form()
{
update_chart_delegate = new UpdateChartDelegate(update_chart);
this.Text = "a realtime plot of sensor values";
}
private void update_chart(string sensor_values)
{
int x = extract_x_value(sensor_values);
int y = extract_y_value(sensor_values);
chart1.Series[X_AXIS].Points.AddY(x);
chart1.Series[Y_AXIS].Points.AddY(y);
}
}
}