2010-09-08 85 views
0

这里是我的代码的情况下,跨线程操作控制

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

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

有人可以帮我这方面吗?

在这种情况下,一切 - 创建面板和控件 - 将是动态的。没有什么会是静态的。

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

+0

Benjol,是的你是正确的,Control.invoke将是答案,但对我来说,我需要添加一个新的控制面板。但是这种方法会更新表单上已存在的控件。让我知道,有没有其他的方式来处理control.invoke()。 – 2010-09-08 12:59:40

回答

4

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

+0

感谢您的回复,但是我的实际问题是..说吧,在我的表单上我们有3个面板,第一个面板上显示一些图像集合,第二个面板中有一些视频,第三个面板中显示一些滚动文本。当第一个面板中的图像发生变化时,滚动文本暂停(颠簸)一段时间。这是因为所有3个控件和更改图片框中图像的计时器都是在同一个线程中创建的(即主线程)。 – 2010-09-08 12:50:55

+1

@N Chary:是*什么*? – 2010-09-08 12:51:30

+0

检查此线程以改善绘图行为的方法:http://stackoverflow.com/questions/2612487/how-to-fix-the-flickering-in-user-controls/2613272#2613272 – 2010-09-08 13:20:46

0

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

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

相关问题