【问题标题】:Cross thread operation on WinForm controlsWinForm控件上的跨线程操作
【发布时间】:2010-09-08 12:44:40
【问题描述】:

这是我的代码场景,

在主线程中,我创建面板(基于某些配置),然后在下一步中基于文件类型(如视频、ppt、图像...)创建适当的控件(动态)以显示在表格上。

控件的创建将在单独的线程中完成(对于每个文件)。创建控件后,当我尝试将该控件添加到面板(在主线程中创建)时会引发错误,类似于cross thread violation, control was accessed from one thread other that it was created

有人可以在这方面帮助我吗?

在这种情况下,一切——创建面板和控件——都将是动态的。没有什么是一成不变的。

我尝试了 StackOverflow 上的一些文章(例如,control.BeginInvoke() .. 等),但无法解决我的问题。

【问题讨论】:

  • Benjol,是的,你是对的,Control.invoke 将是答案,但对我来说,我需要在面板中添加一个新控件。但是这个方法会更新表单上已经存在的控件。让我知道,是否有其他处理 control.invoke() 的方法。

标签: vb.net winforms multithreading


【解决方案1】:

您不能在另一个线程中创建控件并将它们添加到在主 UI 线程中创建的表单中。 Windows 要求顶级窗口所拥有的子窗口属于同一个线程。您必须在 UI 线程中创建它们。利用 Control.Begin/Invoke() 方法。

【讨论】:

  • 感谢您的回复,但我的实际问题是.. 比方说,在我的表单上,我们有 3 个面板,在第一个面板上我展示了一些图像集合,在第二个面板中显示了一些视频,在第三个面板中显示一些滚动文本。当第一个面板中的图像发生变化时,滚动文本会暂停(抖动)一段时间。这是因为所有 3 个控件和更改图片框中图像的计时器都是在同一个线程(即主线程)中创建的。
  • 查看此线程以了解改善绘图行为的方法:stackoverflow.com/questions/2612487/…
  • 上述问题是其他问题之一。这是另一个问题,假设在第一个面板中我们显示图像,在第二个面板中一些PowerPoint演示文稿。在 WebBrowser 控件中完全加载 ppt 需要一些时间(1 或 2 秒)。其他控件(在这种情况下为图像旋转器)被暂停,直到 ppt 加载完成。由于所有这些控件(网络浏览器、更改图像的计时器等)都在单线程(主线程)中。
  • 您正在寻找的魔法不可用。使用启动画面或动画将其覆盖。
【解决方案2】:

只能从主 GUI 线程创建和访问控件。

您可以在其他线程中工作,但不要从其他线程访问 GUI 组件。

【讨论】:

    猜你喜欢
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多