小弟最近做个项目,想用隔一段时间读一次串口的数据并且显示在主界面上,最初的想法是用while死循环,里面用thread.Sleep函数做延时,后来发现这样程序一旦执行就关不掉了(程序死在while循环里了),连主界面上的其他按钮也访问不了了。 因此后来想用多线程,但新开的线程函数似乎不能访问当前窗体的线程的资源,比如不能在另外一个线程里面对当前窗体的textbox控件的text属性赋值,如果非要这么做有点麻烦,似乎要用到委托什么的。 后来又想到了可以访问窗体控件的定时器System.Windows.Forms.Timer,也就是定时一定时间更新一次textbox的text属性,但一运行程序就又卡住了(主窗体上的其他按钮包括关闭按钮都按不了了),并且我加长了定时时间和注释了一些定时触发函数里面的代码,却还是不能点击其他按钮。
求大神指点一下呀。
附:主界面如下:
部分代码为
private void BtnEnd_Click(object sender, EventArgs e)
{
if (port.IsOpen)
port.Close();
}
private void timer1_Tick(object sender, EventArgs e)
{
ComReadThread(sender);
}
public void ComReadThread(object obj)
{
while (port.IsOpen)
{
if (port.BytesToRead > 0)
{
strRecv = port.ReadExisting();
//this.text_showGps.Text += strRecv;
//text_showGps.SelectionStart = text_showGps.TextLength;
//text_showGps.ScrollToCaret();
GetGps();
if (Convert.ToDouble(Longitude) > 0)
{
if (Convert.ToDouble(Longitude) > max_lon)
max_lon = Convert.ToDouble(Longitude);
if (Convert.ToDouble(Latitude) > max_lat)
max_lat = Convert.ToDouble(Latitude);
if (Convert.ToDouble(Longitude) < min_lon && Convert.ToDouble(Longitude) > 0)
min_lon = Convert.ToDouble(Longitude);
if (Convert.ToDouble(Latitude) < min_lat && Convert.ToDouble(Latitude) > 0)
min_lat = Convert.ToDouble(Latitude);
text_maxLon.Text = max_lon.ToString();
text_maxLat.Text = max_lat.ToString();
text_minLon.Text = min_lon.ToString();
text_minLat.Text = min_lat.ToString();
double error_lat = (max_lat - min_lat) * Rj / 180; //获得纬度上的距离 L = Rj * ( lat1 -lat0 ) / 180
//获得经度上的距离 L = Rc * cos(lat0) * ( lon1 -lon0 ) / 180
double error_lon = (max_lon - min_lon) * Rc / 180 * Math.Cos(min_lat / 180);
text_error.Text = (Math.Sqrt(error_lon * error_lon + error_lat * error_lat)).ToString();
//text_error.Text = (Sqrt(error_lon * error_lon + error_lat * error_lat) * 6370000 / 60).ToString();
}
//Thread.Sleep(500);
}
}
}