从c#调用DLL c++函数而不阻塞窗体控件

本文关键字:窗体 控件 函数 调用 DLL c++ | 更新日期: 2023-09-27 18:05:45

我有一个有趣的学习案例给你:)

我有一个包装器集成的问题。我用c++编写了一个Dll。CLR窗口。这个Dll被称为c#应用程序,直到这里。

c#应用程序是第三部分,我不能修改这个源代码。

当我调用一些c++函数,因为一个按钮为例。应用程序被阻塞了,在c++函数返回之前,我不能再做任何事情。我需要当我等待一个c++函数时,不同的公式控件再次启用等等,我需要一些额外的过程。

我试着用异步方法和线程来做,但我不知道如何部署它。

c++函数

__declspec(dllexport) HANDLE openport(char *ComPort, int BR);

c#函数:

[DllImport("mydll.dll")]public static extern IntPtr openport(string ComPort, int BR);

提前感谢你的帮助。

问候。

从c#调用DLL c++函数而不阻塞窗体控件

您的代码需要在一个新线程中运行。深入了解系统。线程名称空间,用于如何创建新线程的指令和示例。实际上,您创建了线程

这是我以前的一个测试程序中的一个例子。

Thread thdOneOfTwo = new Thread(new ParameterizedThreadStart(TextLogsWorkout.DoThreadTask));

在上面的例子中,TextLogsWorkout。DoThreadTask是类TextLogsWorkout上的静态方法,碰巧也包含上面的语句。

你可以选择给每个线程一个名字,并使用一个WaitHandle,它可以在完成分配时发出信号。两者都是可选的,但是必须在实例上执行Start方法。

请注意,您正在进入多线程编程的世界,其中有许多危险等待着粗心的人。如果您还不了解,我建议您阅读互斥锁、等待句柄和固有的lock()块。

在这三种方法中,lock()是单个应用程序同步访问属性的最简单方法。在其他两种方法中,waithandle和互斥锁的复杂性大致相当。然而,虽然WaitHandle可以同步进程内的活动,但Mutex是一个文件系统对象,因此可以同步多个进程之间的活动。在这方面,请注意,如果互斥锁有一个名称,如果它要同步多个进程,那么这个名称必须以"'?"'GLOBALROOT",除非它们都在同一会话中运行。几年前,未能做到这一点让我非常难过。