【发布时间】:2015-04-05 23:28:04
【问题描述】:
我正在尝试从另一个线程访问我的主窗体中的一些控件。
让我们考虑一下这张图片:
我想将该控件(在我的例子中是一个面板)实例化到第二个线程中。
我的问题是我找到了很多答案,这些答案只是修改了一个控件(例如设置文本框的文本)并且无法像对象一样读取/写入它的属性。 (代表和东西)
我当前的代码:(不工作,因为我在另一个线程中创建了面板)
public partial class Main : Form
{
Graphics g;
Thread drawCanvasThread;
int pos = 0;
public Main()
{
InitializeComponent();
}
private void Main_Load(object sender, EventArgs e)
{
g = canvas.CreateGraphics();
drawCanvasThread = new Thread(() => HandleCanvas(canvas));
drawCanvasThread.Start();
}
private void HandleCanvas(Panel objCanvas)
{
Panel canvas = objCanvas;
Point mousePos;
while(true)
{
mousePos = canvas.PointToClient(Cursor.Position);
//UPDATE CANVAS
//DRAW CANVAS
Thread.Sleep(17); //1000 / 17 ~~= 60
}
}
private void Main_FormClosing(object sender, FormClosingEventArgs e)
{
drawCanvasThread.Abort();
}
}
PS:线程“How to update the GUI from another thread in C#?”并没有真正回答我的问题,因为我想读取对象属性,而不仅仅是写入。虽然这是一个非常有趣的线程。
【问题讨论】:
-
"线程'如何从 C# 中的另一个线程更新 GUI?'并没有真正回答我的问题,因为我想读取对象属性,而不仅仅是写入" - 您仍然可以使用线程编组技术来读取属性。但是,我认为您应该重新设计您的应用程序,因为线程编组非常昂贵以至于它可能成为首先使用线程的重大障碍
-
嗯..我不知道如何重新设计它..基本上我正在制作一个关卡编辑器,我想制作一个画布和一个“控件”部分 (i.stack.imgur.com/iIN8X.png) .主题是更新和绘制画布。我会在游戏开发上找到一些建议。无论如何,谢谢。
-
@Riptide Reading 属性不会有什么大不了的。您只需要编组这些调用并从 UI 线程中进行实际读取,或多或少与您进行写入的方式相同。
标签: c# multithreading delegates