c# 使用了定时器却不能访问主界面的按钮

liliuteng liliuteng 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
小弟最近做个项目,想用隔一段时间读一次串口的数据并且显示在主界面上,最初的想法是用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);
}
}
}
...全文

相关推荐

C#使用定时器Timer

更好的做法是使用委托或 `Invoke` 方法来确保线程安全地访问 UI 控件。- 如果定时器不再使用,应通过调用 `Close` 和 `Dispose` 方法释放资源,防止内存泄漏。

areas123

C#登录与主界面设计项目实战

本文还有配套的精品资源,点击获取 简介:本资源展示了如何在C#中设计一个具有登录功能和主界面的桌面应用程序。内容涵盖了C#基础语法、Windows Forms界面设计、控件事件处理、数据库交互、数据访问层与业务逻辑层的实现,以及用户界面的构建和安全性措施。这些知识点对于初学者和经验开发者都具有较高的参考价值,旨在帮助开发者提升编程技能,理解软件架构,并设计实现一个完整的用户...

凡狗蛋

c#使用进度条加载主界面

在C#编程中,"使用进度条加载主界面"是一个常见的用户界面(UI)优化技巧,主要用于提升用户体验,让用户能够直观地看到程序的运行状态。

mxs198609st

c# winform 非常漂亮的按钮 玻璃按钮效果 按钮样式 风格 希望可以给大家提供帮助 源码

总的来说,自定义C# WinForm的按钮样式是提高应用程序用户体验的有效途径,而玻璃按钮效果则是其中的一种流行设计。

mirage1982

C#登陆和主界面 含主界面

**数据访问层(DAL)**:为了保持代码的可维护性和分离关注点,通常会创建一个数据访问层来处理与数据库的通信。这包括创建SQL查询、执行存储过程或使用Entity Framework等ORM工具。

LI9264929
评论 16
收藏 已收藏
分享
返回顶部
liliuteng
C# 111,128 成员 642,536 内容