【发布时间】:2013-12-13 15:06:54
【问题描述】:
我正在尝试制作一个跨平台的 WinForms 软件,其中包含一个 GUI 和一个 3D 窗口。目前,我有一个带有两个选项卡的 TabControl,第二个需要包含 GLControl(3D 窗口)。但是,当我切换到第二个选项卡时,程序在加载 GLControl 时挂起,可能是因为它们在同一个线程上。
我试过用这样的 BackgroundWorker 解决它:
private void onTabSwitch(object sender, EventArgs e)
{
if (tabControl.SelectedIndex == 1)
if (area3D == null)
this.worker.RunWorkerAsync();
}
...
...
...
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
area3D = new GLControl();
area3D.Load += new EventHandler(area3D_Load);
area3D.Paint += new PaintEventHandler(area3D_Paint);
area3D.BackColor = Color.Black;
area3D.Size = new Size(438, 435);
area3D.Location = new Point(200, 0);
this.Invoke((MethodInvoker)delegate
{
secondTab.Controls.Add(area3D); // runs on UI thread
});
}
但它仍然挂起,因为第二个选项卡仍在主 GUI 线程上。我该如何解决这个问题?
最重要的是,我需要在另一个选项卡中设置一个 3D 窗口,该窗口将异步加载,或者只是不会导致我的程序挂起。
【问题讨论】:
标签: c# winforms opengl user-interface opentk