首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重CPU负载下的跨线程BeginInvoke阻塞

重CPU负载下的跨线程BeginInvoke阻塞
EN

Stack Overflow用户
提问于 2012-08-14 22:53:23
回答 2查看 364关注 0票数 2

我有一个Windows用户控件,它包含一个第三方图像显示控件,该控件使用BeginInvoke委托调用从一个单独的线程更新。

在CPU负载很重的情况下,UI会锁定。当我附加调试器时,它总是在更新第三方图像控件的同一代码行上。

代码语言:javascript
运行
复制
    public ICogImage DisplayImage
    {
        get { return this.ResultImageCogDisplay.Image; }
        set 
        {
           this.BeginInvoke((ThreadStart)delegate
            {
                this.ResultImageCogDisplay.Image = value;
            });

        }
    }

如果我注释掉了setter的实现,那么问题就消失了。

,有人能解释为什么会发生这种事吗?

更多信息:

  • 图像更新事件由帧抓取卡周期性地生成(~200 are )。事件在单独的线程上引发。
  • 我相信第三方图像控制使用的是ActiveX,它是康耐视视觉处理框架的一部分。
  • 图像接近。900×800 8位灰度
  • 表单上有4个控件,每个控件来自不同的线程,具有不同的图像。
  • 我尝试过使用和不使用IsInvokeRequired()检查,这似乎没有任何区别。

对PostMessage队列上的消息数量是否有限制,我是在高CPU负载下访问的?

EN

回答 2

Stack Overflow用户

发布于 2012-08-14 23:07:53

BeginInvoke对要在UI线程上执行的操作进行排队。如果您排队的事情足够多,使UI无法跟上它们,您将淹没UI线程,并且它将显示为挂起。尝试将事件控制在每秒一次,看看这是否有帮助。

票数 4
EN

Stack Overflow用户

发布于 2012-08-14 23:45:59

实际上,Windows消息队列条目(至少在32位系统上是这样)有10,000个条目的限制。在此之前很久,通过发布比GUI更快的消息来筛选GUI是非常容易的--我经常这样做:(

通常,我的设计使用一个对象池来进行线程间通信,所以我解决了这个问题,因为如果GUI没有足够快地返回“二手”对象,那么生产者线程就会在池队列中被阻塞,从而提供整体流控制。当然,在停止GUI锁定的同时,如果您有无法满足的帧率要求,则这不会有多大帮助:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11961965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档