C++ 代码更新 C# DLL 中的 GUI
C++ code updating the GUI in C# DLL
我有一个 C++ 应用程序(为特定硬件组件调用 SDK 的函数),并希望在 C# GUI 中显示其数据。 C# 部分是 C++ 调用的 DLL。 (这是应客户的要求,所以我没有太多选择。)
我不是很精通 C#,所以可能遗漏了一些明显的东西,但我 运行 在显示 GUI 和更新它方面遇到了问题。
我使用 this method 访问 C# 代码,代码大致如下(ptr
是一个 class 变量):
// 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 的方法会有帮助吗?
您必须在 UI 线程上更新 C# GUI。请参阅此答案以了解如何从另一个线程同步到 GUI 线程。
C# Windows Forms Application - Updating GUI from another thread AND class?
您可能还会发现“调试位置”工具栏可以方便地确定在 Visual Studio
中进行调试时您当前所在的线程
我有一个 C++ 应用程序(为特定硬件组件调用 SDK 的函数),并希望在 C# GUI 中显示其数据。 C# 部分是 C++ 调用的 DLL。 (这是应客户的要求,所以我没有太多选择。)
我不是很精通 C#,所以可能遗漏了一些明显的东西,但我 运行 在显示 GUI 和更新它方面遇到了问题。
我使用 this method 访问 C# 代码,代码大致如下(ptr
是一个 class 变量):
// 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 的方法会有帮助吗?
您必须在 UI 线程上更新 C# GUI。请参阅此答案以了解如何从另一个线程同步到 GUI 线程。
C# Windows Forms Application - Updating GUI from another thread AND class?
您可能还会发现“调试位置”工具栏可以方便地确定在 Visual Studio
中进行调试时您当前所在的线程