从后台工作程序中的循环更新文本框

2024-01-23

我知道这个问题有人问过(至少从我到目前为止在这里发现的情况来看),但我无法真正理解它。已经尝试过 msdn 的示例,但仍然没有成功。这是我想要做的:我有一个连接到 TLL 标尺的 USB 计数器。我想在循环中不断读取值并将读数写入文本框而不阻塞主 UI。我从其他问题中知道我应该使用 Invoke 或 Backgroundworker,但还没有真正找到我理解并可以用来相应调整我的代码的示例。代码没有任何修改,为了简单起见,如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace USB_Counter
{
public partial class Form1 : Form
{
    [DllImport("HS_UC.dll", EntryPoint = "HS_UC_Close")] //+further DLL imports (driver for USBCounter)
    public static extern int HS_UC_Close(int CounterNo);

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e) //initialize COunter
    {
        int A = HS_UC_Init(1, 3);
        string B = Convert.ToString(A);
        MessageBox.Show(B); //to check if there is no error
    }

    private void button2_Click(object sender, EventArgs e)
    {
        HS_UC_SetDistCode(1, 20, 40, 4, 0, 0); //set Reference
        HS_UC_SetRefMode(1, 1);
    }

    private void button3_Click(object sender, EventArgs e)
    {
        int a = 1;
        int A = 0; //variable that takes counter value (the one I want)
        int B = 0; //variable that takes counter status
        do
        {
            HS_UC_GetCounter(1, ref A, ref B);
            decimal C = (Convert.ToDecimal(A) / 100);
            textBox1.Text = "Das ist: " + C;
            textBox1.Update();
        } while (a == 1);
    }
}

}

现在,这可以作为意图,但正如前面提到的,它会阻塞主 UI 线程(显然)。如果有人发现类似的问题,并提供一些开始使用此多线程主题的有用提示或直接与我的问题相关的任何有用提示,我们将不胜感激。 来自柏林最诚挚的问候, 克里斯

更新:通过以下尝试使其正常工作:

private void Counter_Read()
    {
        int a = 1;
        do
        {
            int A = 0;
            int B = 0;
            HS_UC_GetCounter(1, ref A, ref B);
            decimal C = (Convert.ToDecimal(A) / 100);
            UpdateTextBox(C);
        } while (a == 1);
    }

    public void UpdateTextBox(decimal C)
    {
        if (InvokeRequired)
        {
            this.Invoke(new Action<decimal>(UpdateTextBox), new object[] { C });
            return;
        }
        textBox1.Text = "Das ist: " + C;
        textBox1.Update();

    }

    private void button3_Click(object sender, EventArgs e)
    {
        System.Threading.Thread t = new System.Threading.Thread(() => Counter_Read());
        t.Start();
    }

由此我得到一个十进制输出,我不断更新它并且仍然能够使用其他按钮。


将循环代码外包到方法中。在该方法中您将需要使用BeginInvoke https://msdn.microsoft.com/en-us/library/0b1bf3y3(v=vs.110).aspx写信给TextBox

private void DoTheLoop()
{
    int a = 1;
    int A = 0; //variable that takes counter value (the one I want)
    int B = 0; //variable that takes counter status
    do
    {
        HS_UC_GetCounter(1, ref A, ref B);
        decimal C = (Convert.ToDecimal(A) / 100);
        textBox1.BeginInvoke(new Action(()=>{textBox1.Text = "Das ist: " + C;}));
    } while (a == 1);
}

第一个版本使用正常的Thread https://msdn.microsoft.com/en-us/library/system.threading.thread(v=vs.110).aspx:

创建一个线程并在以下情况下使用新方法启动它button3被点击

private void button3_Click(object sender, EventArgs e)
{
    System.Threading.Thread t = new System.Threading.Thread(()=>DoTheLoop());
    t.Start();
}

这不应阻止您的 GUI,并且文本框将显示值

第二版用一个后台工作者 https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=vs.110).aspx:

创建一个BackgroundWorker并注册DoWork event:

System.ComponentModel.BackgroundWorker worker = new System.ComponentModel.BackgroundWorker();

private void Form1_Load(object sender, EventArgs e)
{
    worker.DoWork += Worker_DoWork;
}

在事件处理程序内部调用相同的方法DoTheLoop():

private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
    DoTheLoop();
}

在按钮单击事件中启动工作人员:

private void button1_Click(object sender, EventArgs e)
{
    worker.RunWorkerAsync();
}

最后的结果是一样的:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从后台工作程序中的循环更新文本框 的相关文章

  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • 使用 CMake 时如何导出 Emscripten 中的 C 函数

    In 本教程 https emscripten org docs porting connecting cpp and javascript Interacting with code html interacting with code
  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 如何最好地以编程方式将 `__attribute__ ((unused))` 应用于这些自动生成的对象?

    In my makefile我有以下目标 它将文本 HTML 资源 编译 为unsigned char数组使用xxd i http linuxcommand org man pages xxd1 html 我将结果包装在匿名命名空间和标头保
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点

随机推荐

  • Git:合并和子模块

    假设我在 RepoX 中有两个分支 分别称为 Branch 和 Branch Repo 还有一个名为 Submodule 的子模块 BranchA 具有修订版 abc 的子模块 Branch 具有修订版 def 的子模块 A 假设我想将 B
  • NSLayoutAttributeLeft 与 NSLayoutAttributeLeading 之间的区别

    有什么区别NSLayoutAttributeLeft and NSLayoutAttributeLeading在iOS自动布局中 领导 并不总是意味着 左 对于 RTL 编写的语言 区域设置 对象对齐矩形的前缘将位于对象的右侧 引用自自动布
  • 项目点击监听器上的列表片段

    我正在尝试使用 OnItemClickListener 在 Android 的 ListFragment 上创建一个列表 但我不能 我单击了 n 个列表项 但没有任何反应 我是碎片新手 这是我的代码 谢谢你 public class MyF
  • 在Heroku 上运行delayed_job 工作线程?

    所以现在我有一个delayed job的实现 它可以在我的本地开发环境中完美运行 为了在我的机器上启动工作程序 我只需运行rake jobs work它工作得很好 为了让delayed job在heroku上工作 我一直在使用几乎相同的命令
  • 将 JSON 数据解析为 .NET 对象的最佳方法

    将 JSON 数据解析为 NET 对象的最佳方法是什么 我正在尝试帮助我的一位编码员朋友 他正在尝试使用 ASP net 将一些数据从 JSON 字符串转储到数据库中 是否有任何预构建的脚本可以实现这一点 预先感谢任何帮助 NET Fram
  • 如何修改我的用户 PROFILE 文件以将我创建的脚本文件夹附加到 PATH 变量的末尾? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何修改我的用户 PROFILE 文件以将我创建的脚本文件夹附加到 PATH 变量的末尾 我不太确定这意味着什么 谁能解释一下吗 在 un
  • 如何检查屏幕是否正在运行?

    如何在Python中检查屏幕是否具有给定的名称 例如 检查server1是否正在运行 谢谢 用于查找当前屏幕会话的内置命令是screen ls 要在 python 中获得相同的功能 from subprocess import check
  • HTML5 中的

    有几篇关于这个主题的文章 但我无法理解之间的相关区别
  • gridview 内的 CheckBox 选中状态

    我有一个简单的网格视图
  • 如何使用 RxJS 在 Angular 6 中发出一系列 http 请求

    我一直在网上寻找解决方案 但找不到任何适合我的用户案例的解决方案 我正在使用 MEAN 堆栈 Angular 6 并且我有一张注册表 我正在寻找一种方法来执行对 API 的多个 HTTP 调用 每个调用都依赖于前一个调用的返回结果 我需要看
  • 如何在 Angular4 中获取 FormControl 的值

    我对 Angular4 有一些经验 但我只是继承了一段使用 FormControls 的代码 我不知道如何使用它们 我正在设置一个注释文本区域 如果 isRegulatoryAuditRequired 的值等于 false 则需要该注释文本
  • jquery - 如何显示隐藏的div

    我的页面中嵌入了一个谷歌地图 其可见性设置为隐藏 我想使用按钮在页面上显示地图 应该使用jquery来完成 我的代码 不工作 div style height 350px border 1px solid 979797 div 任何人都可以
  • 在 C++ Microsoft Visual Studio 2010 中调试器多个环境变量

    在设置环境变量时 我在 Visual Studio 2010 Professional C 调试器中遇到了一个非常简单的问题 描述于 http msdn microsoft com en en library kcw4dzyf aspx h
  • 是否可以使用eclipse仅构建一次java项目并共享?

    是否有可能实际构建一个包含java代码的maven项目 构建一次并且二进制文件可以共享 问题 我尝试构建的项目大约需要 3 4 小时 并且需要高互联网带宽 我正在尝试检查在其他几台机器中重新使用这个构建项目的可能性 我之前曾处理过涉及 ma
  • 如何在 using 语句中使用对象初始值设定项?

    有没有什么方法可以重构此代码 以便不必使用临时变量 而仍然使用与对象初始值设定项关联的语法糖 FrmSomeForm someTempForm new FrmSomeForm SomePropA A SomePropB B SomeProp
  • Go 闭包变量作用域

    我正在阅读 CreateSpace Go 2012 编程简介 在第 86 页我发现了这个邪恶的魔法 func makeEvenGenerator func uint i uint 0 return func ret uint ret i i
  • TypeScript - 将动态属性名称传递给子级

    我正在开发一个带有嵌套路由的路由库 我试图定义一个推断父路径的子处理函数 原因是我有另一种类型 可以从字符串推断动态路径参数 例如 users id to id string 因此 我希望能够将推断的路径参数从父路由传递到每个子路由处理函数
  • 使用 Jasmine 在 Angular 5 中进行单元测试模型绑定

    我正在尝试编写一个单元测试来测试从组件方法调用返回的 JSON 数据是否成功绑定到打字稿模型 我的模型如下所示 export interface IPlayerAccount playerId number name string phon
  • 如何从 TFS 源代码管理中排除特定文件

    我们有多个配置文件 app DEV config app TEST config 等 和一个将正确的配置文件复制到 app config 的预构建事件 显然 配置特定文件位于源代码管理中 但目前 App Config 也是如此 但不应该如此
  • 从后台工作程序中的循环更新文本框

    我知道这个问题有人问过 至少从我到目前为止在这里发现的情况来看 但我无法真正理解它 已经尝试过 msdn 的示例 但仍然没有成功 这是我想要做的 我有一个连接到 TLL 标尺的 USB 计数器 我想在循环中不断读取值并将读数写入文本框而不阻