degenerate_lord 2016-02-27 02:29 采纳率: 0%
浏览 2596

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:\MvcAAA\MvcAAA\bin\meshlab.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;
}
  • 写回答

1条回答 默认 最新

  • threenewbee 2016-02-27 22:41
    关注

    DLDApi怎么实现的?里面怎么加载的dll,又是怎么释放的。

    评论

报告相同问题?

悬赏问题

  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型