【发布时间】:2012-10-29 18:28:58
【问题描述】:
我在 Visual Studio 2010 中使用 C# 和 Winforms
我有一个程序,我试图通过串行端口读取输出并将其打印到屏幕上。它最初是作为一个控制台程序开始的,但现在已经发展到我们希望将输出放在表单上的字段中。我有代码可以解析出我正在寻找的输出的串行端口写入和工作,我只需将 Console.WriteLine 更改为 label.text = "";,基本上。我已将监听串口的函数合并到 GUI 代码中,所以所有内容都在同一个文件中。
不过,我对如何让函数写入标签感到困惑。它是静态的,所以我不能只说'label.text ='。我尝试在要使用的函数内创建一个新的表单对象,这允许我访问表单上的控件,但没有更新我在运行时看到的表单(我猜是因为我创建了表单的新实例而不是访问现有实例?)
我还需要让串行侦听器与 GUI 同时运行,因此 GUI 标签将更新为接近实时运行该函数所获得的结果,所以我尝试设置它要线程化,GUI 是由 main() 启动的一个线程,串行侦听器是另一个线程,当我单击按钮启动它时启动它。但是,我遇到了同样的问题,无法访问串行侦听器线程中的标签,因为它必须是静态的才能使用 system.threading 进行初始化。
我在想也许我需要为串行侦听器使用后台工作人员,但我对这些的经验绝对为零。后台工作人员能否实时更新 GUI 上的标签?
我不能发布具体的代码,但这是大致的想法:
Main() 启动 GUIthread
GUI 具有启动串行侦听器的按钮 OnClick 按钮启动 ListenerThread ListenerThread 输出到控制台,希望输出到表单标签
无法访问 GUI.Label,因为 Listener 是静态的,无需线程化 在 Listener 中创建新的 GUI 实例允许我调用该实例的控件,但它们不会在运行时更新 GUI
确保标签是公开的。
【问题讨论】:
-
看到更新标签时出现的错误吗?
-
很遗憾没有,但是如果您对某事有特定的疑问,我可以告诉您或解释一下。
-
我能够成功编译的唯一方法是在侦听器函数中创建 GUI 表单的新实例 (testgui gui = new testgui();),然后通过说 gui 访问标签。标签,虽然这不起作用,因为我猜这算作 gui 的一个“不同”实例,而不是我启动应用程序时启动的那个实例。不过,我可能是不正确的
-
@JoshBibb 你检查标签修饰符了吗?您无法引用标签吗?
-
我已确保标签是公开的。我无法访问它,因为我试图从静态侦听器方法访问它,这是非法的。而且我不能使该函数成为非静态函数,否则我将无法使用它设置线程
标签: c# multithreading user-interface