【问题标题】:C++ code updating the GUI in C# DLLC++ 代码更新 C# DLL 中的 GUI
【发布时间】:2016-10-15 21:39:02
【问题描述】:

我有一个 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 的方法会有所帮助吗?

【问题讨论】:

    标签: c# c++ multithreading unmanaged


    【解决方案1】:

    您必须在 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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多