如何启动一个线程来保持GUI刷新?

2024-01-27

我有一个带有按钮的窗口,它会触发冗长的处理。我将处理放在一个单独的线程中,但令我惊讶的是,它无论如何都会使 GUI 冻结。没有控件刷新,我什至无法移动窗口。

So 问题是如何启动线程,这样它就不会干扰GUI,即GUI将始终是最新的(在处理时我更改数据,并且GUI显示其中的一些部分)?

这就是我正确启动线程的方式:

        var thread = new Thread(doLearn);
        thread.IsBackground = true;
        thread.Start();

Edit 1

Jon:

  1. 我根本不使用任何锁
  2. 没有加入通话
  3. UI 线程被单独保留——它只是坐在那里

处理是一个带有数学运算的大循环,甚至不分配内存,在 UI 方面,我有与数据绑定(WPF)的控件,例如主循环的当前迭代次数。每次主循环“滴答”时都应该刷新它。循环的计数器是一个属性,每次更改都会触发 OnPropertyChanged(经典 WPF 绑定)。

编辑2——快到了!

好的,乔恩一语中的(谁是惊喜?;-D)——谢谢!问题来自于更改计数器。当我使用本地计数器代替计数器时,GUI 被刷新——我的意思是我可以移动窗口,但是......我看不到计数器的显示。

我这里有一个 WPF GUI,带有这样的数据绑定

<TextBlock Text="{Binding Path=Counter"/>

当然,我有 Counter 属性,每次更改都会发送事件 PropertyChanged。其中一位听众肯定是 GUI。

所以,Jon 的答案是有效的“答案”,但从良好的设计 POV 来看并不完全如此,因为如果 GUI 部分必须提取有关计数器的信息并每(比方说)3 秒更新一次显示,为什么有人会使用数据绑定?对我来说,这种方法使数据绑定的想法无效。

理论上,我可以将 GUI 调度程序传递给处理线程,并在 GUI 线程中完成所有发送,并且它可以工作(我没有尝试),但这意味着非 GUI 部分和 GUI 部分的紧密耦合。

到目前为止,我不知道如何以“正确”的方式做到这一点。到目前为止最好的猜测是创建 TimerDispatcher 但不是在 GUI 端而是在处理库内部,并立即更新 Counter 值,但不时进行所有发送(不过我还没有尝试过)。

小备注:我实际上绑定了更多属性,例如 IsRunning,它在处理开始和结束时更改。这些更改确实会正确影响显示 - 但计数器更改会在 3-4 秒内触发大约 3000 个通知。所以看起来像是干扰问题。我做了另一个测试——我部分地终止了数据绑定,因此发送了通知,但 GUI 没有“接收”它们——而是在监听它们。在这种情况下,GUI 也被冻结。

所以,我仍在听取所有建议——提前感谢您的分享。

Edit 3

故事在这里继续:

如何使用数据绑定进行处理并保持 GUI 刷新? https://stackoverflow.com/questions/4522583/how-to-do-the-processing-and-keep-gui-refreshed-using-databinding


就这样应该没问题。可能会冻结你的用户界面的事情:

  • 您是否在 UI 线程中锁定,并在其他线程中锁定同一个锁?
  • 你打电话吗Join在你的 UI 线程的线程上?
  • 你在做一些吗otherUI 线程中的繁重工作?

如果你能想出一个简短但完整的程序来显示问题,我相信我们可以帮助解决它......但它肯定should好好地。

编辑:好的,现在您已经添加了以下内容:

循环的计数器是一个属性,每次更改都会触发 OnPropertyChanged(经典 WPF 绑定)。

那么您要从非 UI 线程更新属性吗?我预计这会导致问题,因为它会从错误的线程触发 UI 更改。

我建议您采取以下方法:

  • 通过定期更新计数器Dispatcher.BeginInvoke
  • 拥有“UI 计数器”和“工作计数器” - 并通过 UI 线程中的“工作计数器”将值复制到“UI 计数器”DispatcherTimer,本质上是轮询它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何启动一个线程来保持GUI刷新? 的相关文章

  • 在 Haskell 中创建 100 万个线程需要多长时间?

    据我了解 Haskell 有绿色线程 但它们的重量有多轻 是否可以创建100万个线程 或者 100 000 个线程需要多长时间 from here http www reddit com r programming comments a4n
  • SetWindowsHookEx 函数返回 NULL

    我正在研究 DLL 注入 但收到错误如下 挂接进程失败 87 参数不正确 目标进程和dll都是64位的 注入代码为 BOOL HookInjection TCHAR target TCHAR dll name https msdn micr
  • 没有 Unicode 字节顺序标记。无法切换到 Unicode

    我正在使用 XSD 编写 XML 验证器 下面是我所做的 但是当验证器到达该线时while list Read 它给了我错误 没有 Unicode 字节顺序标记 无法切换到 Unicode 有人可以帮我解决吗 public class Va
  • 检查列表是否包含另一个列表。 C#

    编辑 只是说 ContainsAllItem 中的注释解释得最好 很抱歉问这个问题 我知道以前有人问过这个问题 但我只是不明白 好的 所以我想检查一个列表是否包含另一个列表中的所有项目WITHOUT重叠 以及根据类字符串 名称变量 称为项目
  • 在运行时设置 DataGridView 上的 DataFormatString?

    是否可以在运行时设置 ASP NET DataGridView 中的列或单元格的 DataFormatString 属性 这应该有效 BoundField priceField grid Columns 0 as BoundField pr
  • 在 GCC 和 Clang 下,使用 lambda 的简单 RAII 包装器的复制初始化意外失败

    我在创建一个简单的 RAII 包装器时遇到了一个意想不到的问题 更不用说下面代码的逻辑不完整性了 复制构造函数和赋值运算符未删除等 这意味着是一个SSCCE 令我印象深刻的是复制初始化我的包装器与临时 lambda 的结果会导致编译错误 而
  • 如何将字节块读入结构体

    我有一个需要处理的资源文件 它包含一组文件 首先 资源文件列出了其中包含的所有文件 以及一些其他数据 例如在此结构中 struct FileEntry byte Value1 char Filename 12 byte Value2 byt
  • 将 C# 反射代码移植到 Metro-Ui

    我正在尝试移植使用反射的现有 C 类 通用工厂 但我无法编译这段代码 Type types Assembly GetAssembly typeof TProduct GetTypes foreach Type type in types i
  • 使用反射获取基类的受保护属性值

    I would like to know if it is possible to access the value of the ConfigurationId property which is located in the base
  • 导出到 CSV 时 Gridview 出现空行

    这个问题是由进一步讨论引发的这个问题 https stackoverflow com questions 6674555 export gridview data into csv file 6674589 noredirect 1 com
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • c# 如何生成锦标赛括号 HTML 表

    所以我已经被这个问题困扰了三个星期 但我一生都无法弄清楚 我想做的是使用表格获得这种输出 演示 http www esl world net masters season6 hanover sc2 playoffs rankings htt
  • C# 中处理 SQL 死锁的模式?

    我正在用 C 编写一个访问 SQL Server 2005 数据库的应用程序 该应用程序是数据库密集型的 即使我尝试优化所有访问 设置适当的索引等 我预计迟早会遇到死锁 我知道为什么会发生数据库死锁 但我怀疑我能否在某个时候发布不发生死锁的
  • realloc():重新分配为 char * 上的 strcat 腾出空间时下一个大小无效 [重复]

    这个问题在这里已经有答案了 我在以下代码中收到无效内存错误 printf s n FINE 5 printf s LENGTH IS d n FINE 6 strlen buffer char realloc buffer strlen b
  • C++ 标准中短语“构造函数没有名称”的含义

    在尝试理解 C 标准中的 构造函数没有名称 这句话时 我似乎在 clang 中发现了一个错误 有人可以证实这一点吗 VS2015 and gcc rejects this code and I think they it are is co
  • 将 bignum 类型结构转换为人类可读字符串的有效方法是什么?

    我有一点问题 为了增长我的 C 知识 我决定尝试实现一个基本的 bigint 库 bigint 结构的核心将是一个 32 位整数数组 选择它们是因为它们适合寄存器 这将允许我在数字之间进行操作 这些操作将在 64 位整数中溢出 这也将适合寄
  • 如何将 CSV 文件读入 .NET 数据表

    如何将 CSV 文件加载到System Data DataTable 根据CSV文件创建数据表 常规 ADO net 功能是否允许这样做 我一直在使用OleDb提供者 但是 如果您正在读取具有数值的行 但希望将它们视为文本 则会出现问题 但
  • 将一个 long 转换为两个 int 以进行重构

    我需要将一个参数作为两个 int 参数传递给 Telerik Report 因为它不能接受长参数 将 long 拆分为两个 int 并在不丢失数据的情况下重建它的最简单方法是什么 使用掩蔽和移位是最好的选择 根据文档 long 保证为 64
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows
  • 如何从函数返回矩阵(二维数组)? (C)

    我创建了一个生成宾果板的函数 我想返回宾果板 正如我没想到的那样 它不起作用 这是函数 int generateBoard int board N M i j fillNum Boolean exists True initilize se

随机推荐

  • 在页面中央打印 html 文本

    我有一个下一个问题 试图用谷歌找到它 但没有找到什么可以帮助我 我有一个大的 HTML 文件需要打印 我使用 CSS 来分隔页面break after 问题是 如何在页面中央打印一个元素 不仅是水平居中 而且是垂直居中 HTML 看起来像这
  • 如何获取制表符?

    在 HTML 中 选项卡没有字符 但我很困惑为什么我可以在此处复制并粘贴一个字符 您看不到它的完整宽度 但如果您单击编辑我的问题 您会看到该字符 如果我可以复制并粘贴制表符 那么应该有一个可以编码为 html 的 unicode 等效项 我
  • 使用 ADFS IdP 进行单点注销的正确 LogoutRequest

    我成功使用 OneLogin java saml 库进行 SAML SSO 但 Active Directory 联合身份验证服务 ADFS 的 SLO 单点注销 存在问题 该库创建的 LogoutRequest 被 ADFS 拒绝 但被
  • 点覆盖问题

    我最近在测试中遇到了这个问题 给定一组点m 全部在 x 轴上 和一组n具有端点的线 l r 再次在 x 轴上 找到 的最小子集n这样所有的点都被一条线覆盖 证明你的解决方案总是能找到最小子集 我为它编写的算法的效果是 假设线存储为数组 左端
  • SQL-将长整数转换为日期时间

    我有一个数据库 其日期采用以下长整数格式 20100101000000 其中该时间为 2010 年 1 月 1 日 00 00 00 我希望能够将其转换为正常的 SQL 日期时间语法并返回 这可能吗 我只能走到这一步 SELECT CAST
  • 事务之间的竞争条件

    我正在使用 Spring MVC 开发 webapp 并在我的应用程序中有这样的方法 Transactional public void methodA Long id String color Fruit fruit entityMana
  • in_array() 期望参数 2 为数组,Classipress 中给出的字符串

    我在用着Classipress theme对于 wordpress 我正在尝试将我的精选广告粘贴到类别中 我发现一个返回此错误的代码 Warning in array expects parameter 2 to be array stri
  • Android 上 之间的区别

    我现在对两个明显元素之间的区别感到困惑 我认为仅使用 Google Play 会过滤掉不属于支持屏幕列表的设备 该应用程序不会显示在这些设备上的搜索结果中 我以为使用就足够了 但似乎不起作用 我也需要包含吗 有人可以向我解释自然语言的区别吗
  • 如何通过jquery从数据库接收数据? [wordpress.js]

    我正在尝试从 WordPress 主题的 js 文件中的数据库中获取一些数据 我尝试使用 jquery 的 post 但没有任何反应 还请建议我任何替代方案 js 文件中的代码 jq post abc php name kumar accI
  • 磁带平衡 Codility 培训计划

    我在 Codility 中提交了磁带平衡问题的解决方案 礼貌培训 1 问题描述如下 给出一个由 N 个整数组成的非空零索引数组 A 数组 A 代表磁带上的数字 任何整数 P 使得 0 我提交的解决方案是 class Solution pub
  • 我怎样才能避免codeigniter中的URL中的index.php [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在使用 apache 服务器 我
  • extern "C" 带有类和 DLL

    我得到了一个 C DLL 源代码 它使用extern C extern C class Something public declspec dllexport Something declspec dllexport virtual Som
  • 读取 Parquet 文件时是什么控制分区数量?

    我的设置 两个 Spark 集群 一份在 EC2 上 一份在 Amazon EMR 上 两者均使用 Spark 1 3 1 EMR集群已安装emr 引导操作 https github com awslabs emr bootstrap ac
  • play框架2.0支持memcached吗?

    我阅读了 Play Framework 2 0 文档 但没有任何关于 memcached 的文字 如何在 Play Framework 2 0 中使用 memcached 为什么在2 0中消失 在1 x中 这很容易 正如评论中已经指出的 默
  • 当 Jenkins 安装在登台服务器上时,如何在本地访问 Jenkins 仪表板?

    我已经通过 putty 在我的项目 网站 的 Ubuntu 临时服务器上安装了 Jenkins 就像我在 WINDOWS7 上一样 我启动了它并检查它是否在那里运行 但是当尝试访问时http staging website com 8080
  • 使用 Javascript 将类添加到每个第三个元素

    我正在尝试使用 javascript 选择父级的每三个元素并向其添加一个 css 类 对我来说听起来很简单 但我无法让它发挥作用 我发现this https stackoverflow com questions 4274673 javas
  • 多实例模式的 C++ 模板类实现

    我使用 C 中的模板类实现了 multiton 模式 ifndef MULTITON H define MULTITON H include
  • 从自动旋转动画中排除 UIView

    TL DR 需要保持自动旋转 但在方向改变时排除一个 UIView 自动旋转 如何 背景故事 我需要在动画过程中保持 UIView 静止并伴随自动旋转 这发生在方向改变时 类似于 iOS 相机应用程序处理旋转的方式 即控件在其位置旋转 我尝
  • 在C#中调用exe程序

    如何从一个 C 文件调用另一个 C 文件生成的 exe using System Diagnostics string command C tmp myExe exe my params ProcessStartInfo procStart
  • 如何启动一个线程来保持GUI刷新?

    我有一个带有按钮的窗口 它会触发冗长的处理 我将处理放在一个单独的线程中 但令我惊讶的是 它无论如何都会使 GUI 冻结 没有控件刷新 我什至无法移动窗口 So 问题是如何启动线程 这样它就不会干扰GUI 即GUI将始终是最新的 在处理时我