用C#DLL更新GUI的C ++代码

时间:2016-06-15 00:12:16

标签: c# c++ multithreading unmanaged

我有一个C ++应用程序(为特定硬件组件调用SDK的功能),并希望在C#GUI中显示其数据。 C#部分是C ++调用的DLL。 (这是根据客户的要求,所以我没有太多选择。)

我不太熟悉C#,所以可能会遗漏一些明显的东西,但我遇到了显示GUI和更新它的问题。

我使用this method访问C#代码,代码大致相似(ptr是一个类变量):

// Initialize COM.
CoInitialize(NULL);

ptr = new IPtr(__uuidof(ManagedClass));
(*ptr)->ShowForm();

然后在另一个帖子中:

if (updating) (*ptr)->Update(data)

在C#方面我们有:

FormClass myForm;
void ShowForm()
{
myForm = new FormClass();
Application.Run(myForm);
}
void Update(Data data)
{
myForm.Update(data)
}

当我使用Application.Run或ShowDialog来显示我的GUI时,表单很好地显示,但更新使应用程序崩溃。使用Show会让GUI卡住。使用BeginInvoke导致GUI永远不会出现。

在这个设置下,有没有推荐的方法让我启动GUI?在Update中使用Invoke / BackgroundWorker而不是直接调用myForm的方法会有帮助吗?

1 个答案:

答案 0 :(得分:2)

您必须在UI线程上更新C#GUI。请参阅此答案,了解如何从另一个线程同步到GUI线程。

C# Windows Forms Application - Updating GUI from another thread AND class?

您可能还会找到“调试位置”工具栏,以确定在Visual Studio中进行调试时当前所处的线程

https://blogs.msdn.microsoft.com/davedev/2012/07/18/where-is-the-suspend-resume-and-terminate-toolbar-in-visual-studio-2012-ultimate/