问题描述
- C# 使用 Widgets must be created in the GUI thread
-
在使用C#调用qt的dll时,第一次调用的一般没事,第二,三次就会出现Widgets must be created in the GUI thread。 这是我用的qt中的代码 BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpvReserved*/ ) { static bool ownApplication = FALSE; if ( dwReason == DLL_PROCESS_ATTACH ) { ownApplication = QMfcApp::pluginInstance( hInstance ); } if ( dwReason == DLL_PROCESS_DETACH && ownApplication ) { delete qApp; } return TRUE; } 这是C#中调用qt的代码 myfun1 = new DLDApi(); myfun1.LoadDll(@"D:MvcAAAMvcAAAbinmeshlab.dll"); // 加载 "Count.dll" myfun1.LoadFun("Test"); // 调入函数 count, "_count@4" 是它的入口,可通过 Depends 查看 object[] Parameters = new object[] { (int)5}; // 实参为 0 Type[] ParameterTypes = new Type[] { typeof(int) }; // 实参类型为 int DLDApi.ModePass[] themode = new DLDApi.ModePass[] { DLDApi.ModePass.ByValue }; // 传送方式为值传 Type Type_Return = typeof(int); // 返回类型为 int // 弹出提示框,显示调用 myfun.Invoke 方法的结果,即调用 count 函数 int i = (int)myfun1.Invoke(Parameters, ParameterTypes, themode, Type_Return); myfun1.UnLoadDll(); C#代码在运行**UnLoadDll**卸载dll方法后,DLL_PROCESS_DETACH中断delete app并没有被执行,整个dll里面有一个qt的线程,卸载了dll后线程并没有被关闭,导致第二次运行的时候无法再次创建QWidegt对象。 想要请教以下各位,如何让在调用完dll后让中的线程关闭掉。是应该写在C++的这个dll中还是写在C#的调用中, 同时这个qt的dll中有一个对象My3Doperation,这个对象继承与QWidget,如何在使用完这个对象后将创建的线程彻底删除。 extern "C" __declspec(dllexport) int Test(int fileName) { My3Doperation model; //计算代码 return fileName+5; }
解决方案
DLDApi怎么实现的?里面怎么加载的dll,又是怎么释放的。
时间: 2024-11-01 04:55:33