gpt4 book ai didi

C# - Compact Framework Windows CE - GUI 线程阻塞更高优先级的线程

转载 作者:行者123 更新时间:2023-11-30 22:36:34 24 4
gpt4 key购买 nike

我遇到一个问题,我有一个用 C# 编写的 Windows CE 紧凑框架应用程序,我将主 GUI 线程设置为正常优先级,并将通信线程设置为高于正常优先级以获得接近伪实时性能.我遇到的问题是在按钮处理程序中,我运行一个循环以将配置数据从文件加载到 GUI,然后再允许对其进行编辑。这大约需要 2-3 秒才能完成。当事件处理程序中发生这种阻塞时,我的优先级更高的通信线程被阻塞了。没有锁是线程同步到位。通信线程不依赖于 GUI 线程。

这就是我生成通信线程的方式:

        MbWorkerThread = new Thread(MbPollingThread);
MbWorkerThread.IsBackground = true;
MbWorkerThread.Priority = ThreadPriority.AboveNormal;
MbWorkerThread.Start();

这是一个 MTA 应用程序。此外,我曾尝试在 GUI 事件处理程序中使用 Thread.Sleep(1) 来屈服于更高优先级的线程,但它不起作用。我还尝试使用信号来让位于更高优先级的线程,但这不起作用。唯一可行的是,如果我在事件处理程序中加载配置时将 Application.DoEvents() 放在循环中。这太粗糙了,只是一个测试,因为我不想在我的代码中散布 Application.DoEvents() 以使其工作,因为我知道 Application.DoEvents() 是危险的。

我的理解是主 GUI 线程是一个前台线程,但仍然是一个线程。此外,我将通信线程设为后台线程,以便在主线程退出时将其杀死。

我什么都试过了,在问这个问题之前我在网上无休止地搜索。

任何帮助将不胜感激。

附言- 我考虑过表单计时器,但我知道它在 GUI 线程中运行,所以这无济于事。我想到了另一个线程,但我真的不知道如何通过调用来编码 GUI 更新。

最佳答案

您的程序从 Main() 开始,您通常会在此处调用 Application.Run( new MyForm() )Application.Run() 实现了标准的 Windows 消息泵,它处理来自操作系统和其他应用程序的消息,包括用户输入、进程间通信、重绘请求等。

GUI 事件,如按钮点击,是通过该线程分派(dispatch)的。如果您在事件处理程序中执行长时间运行的工作,则不会处理其他消息。

Application.DoEvents() 阻塞调用线程,并等待处理所有未决消息。如果 DoEvents 帮助您的通信线程而 Sleep(1) 没有,那么我怀疑您的通信线程和 GUI/Message Pump 线程之间存在依赖关系。

即使不是这种情况,阻塞 GUI 线程也不是一个好主意。使用 ThreadPool.QueueUserWorkItem() 将您的文件加载到后台,并在最后使用 InvokeBeginInvoke 将结果编码回 UI。

关于C# - Compact Framework Windows CE - GUI 线程阻塞更高优先级的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6930774/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com