我创建了一个Windows窗体应用程序(C#,.NET Framework 4.5),用于绘制通过串行线路接收的数据(例如连接到微控制器的传感器)。对于图形我使用的是ZedGraph库。我遇到的问题是,如果我在接收和绘制数据时点击标题栏,图表会在点击持续时间内冻结。一旦我释放鼠标左键,它通常会继续绘图,但它现在只是将点击之前收到的数据点与鼠标按钮释放后立即接收的数据点连接起来。示例如下所示:
这似乎仅在图形部分发生,因为程序还将接收的数据输出到文件。如果我在测量后将所接收的数据绘制在另一个程序中(Excel,Matlab,...),则所有数据都应该没有任何中断。
我试图找出原因,但我无法在任何地方找到类似的例子,所以任何帮助都会受到赞赏。
为了简化寻找解决方案的过程,我还创建了一个较小的程序,只需打印从秒表到textBox的时间。这是代码:
namespace ClickFreezeTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
System.Threading.Thread t = new System.Threading.Thread(() => updateTextBox());
t.IsBackground = true;
t.Start();
}
private void updateTextBox()
{
Stopwatch myStopWatch = new Stopwatch();
myStopWatch.Start();
int a = 1;
while (a == 1)
{
textBox1.BeginInvoke(new Action(() => { textBox1.Text = Convert.ToString(myStopWatch.Elapsed); }));
Thread.Sleep(100);
}
}
}
}
表格如下:
如上面的代码所示,textBox在单独的线程上每100毫秒更新一次。同样的问题出现在串行图形程序中,所以我假设如果解决方案存在,它必须对表单设置做一些事情,也许是一个允许用户用鼠标做某事的控件。