从c#调用DLL c++函数而不阻塞窗体控件
Call DLL C++ functions form C# without block the form controls
我有一个有趣的学习案例给你:)
我有一个包装器集成的问题。我用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);
提前感谢你的帮助。
问候。
您的代码需要在一个新线程中运行。深入了解系统。线程名称空间,用于如何创建新线程的指令和示例。实际上,您创建了线程
这是我以前的一个测试程序中的一个例子。
Thread thdOneOfTwo = new Thread(new ParameterizedThreadStart(TextLogsWorkout.DoThreadTask));
在上面的例子中,TextLogsWorkout。DoThreadTask是类TextLogsWorkout上的静态方法,碰巧也包含上面的语句。
你可以选择给每个线程一个名字,并使用一个WaitHandle,它可以在完成分配时发出信号。两者都是可选的,但是必须在实例上执行Start方法。
请注意,您正在进入多线程编程的世界,其中有许多危险等待着粗心的人。如果您还不了解,我建议您阅读互斥锁、等待句柄和固有的lock()块。
在这三种方法中,lock()是单个应用程序同步访问属性的最简单方法。在其他两种方法中,waithandle和互斥锁的复杂性大致相当。然而,虽然WaitHandle可以同步进程内的活动,但Mutex是一个文件系统对象,因此可以同步多个进程之间的活动。在这方面,请注意,如果互斥锁有一个名称,如果它要同步多个进程,那么这个名称必须以"?"GLOBALROOT",除非它们都在同一会话中运行。几年前,未能做到这一点让我非常难过。相关文章:
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 在编译时,C++项目抛出错误 C2228,这是预期的,因为控件在运行时未达到该点
- 如何更改窗体上所有控件的标题?[C++生成器]
- 双击更改 mfc 中列表控件中的行的颜色
- 派生的 wxPanel 控件如何访问其中包含 wxDialog 中的数据?
- 如何从代码本身向 wxwidgets 中的文本控件插入字符?
- 如何在MFC中的静态文本控件上插入图标?
- 我的主窗口在创建时或单击更新区域时是否会收到编辑控件?
- 如何在Qt C++中向自定义控件添加属性?
- C/C++ 检测双击 TVItem 的常用控件
- C++ 如何将用户控件添加到窗体,以便我可以在面板之间转换
- 调整窗体大小时调整控件的大小
- 如何从子窗体C++.NET访问MdiParent控件
- 在Visual studio中将用户控件集成到窗体中
- 在多字节字符集应用程序中的MFC窗体控件上设置Unicode文本
- 在线程中更改Windows窗体控件
- 从c#调用DLL c++函数而不阻塞窗体控件
- 如何在c++ /CLI中使用设计器继承现有的Windows窗体控件
- Visual Studio在试图向MFC窗体上的控件添加处理程序时崩溃