2 u011522596 u011522596 于 2016.02.27 10:29 提问

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个回答

caozhy
caozhy   Ds   Rxr 2016.02.28 06:41

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
用QT编程时遇到的错误总结
前段时间终于把设备管理上位机完成的差不多了,用了差不多有半个月的时间了,因为对QT还不是特别的熟悉,所以中间还是摸索QT的过程。这个上位机程序用到了多线程,数据库操作,网络套接字还有一些界面操作。使用的IDE我选用的是QT CREATOR,个人觉得还是很好用的,里面集成了QT DESIGNER,QT HELP,,QT DEBUG(虽然暂时我还没用过调试器,都是使用Qdebug打印信息和QMesse
Qt5生成Word格式报告
初探了Qt5通过word模板生成报告的方法,整理了使用时的环境配置、子线程中使用时的注意事项以及常用的操作方法。环境:vs2012+Qt5.2
线程使用方法之run
thread.h#ifndef THREAD_H #define THREAD_H#include <QThread>class Thread : public QThread { Q_OBJECTpublic: explicit Thread();private: void run();signals: void sendCloseFlag(int); };#end
QT上位机编写
<br />      前段时间终于把设备管理上位机完成的差不多了,用了差不多有半个月的时间了,因为对QT还不是特别的熟悉,所以中间还是摸索QT的过程。这个上位机程序用到了多线程,数据库操作,网络套接字还有一些界面操作。使用的IDE我选用的是QT CREATOR,个人觉得还是很好用的,里面集成了QT DESIGNER,QT HELP,,QT DEBUG(虽然暂时我还没用过调试器,都是使用Qdebug打印信息和QMesseageBox输出对话框来调试的),QT CREATOR编辑环境也是相当不错的,特别是自动
python GUI程序编译报错
在写一个简单的python GUi程序运行时,报出错误 : PyNoAppError: The wx.App object must be created first! 原代码如下: import wx class Frame(wx.Frame): def __init__(self,superior): wx.Frame.__init__(self,parent =
感谢狄泰软件的唐老师,QT项目中遇到的问题,痛苦的开发回忆.
毛爷爷教导我们说:战略上要藐视敌人,战术上要重视敌人,发现自己过于自大了!自己战术和战略都不精的情况下就开始藐视了。         学习C++ 和QT 有段时间了,加上之前一直在修改接手的Qt项目,本来应该对开发Qt项目应该的心应手的(自大),然而公司新的项目立项了,我苦命的开发历程开始了,就感觉自己从来没用使用过Qt和C++一样,对C++和QT的使用都是那种“一知半解”的状态中,用唐老大的话
wxPython 进行GUI 设计解决PyNoAppError: The wx.App object must be created first!
安装wxPython 下载网址:https://sourceforge.net/projects/wxpython/files/wxPython,选择和自己电脑操作系统以及python版本对应的安装即可 例子: # -*- coding: utf-8 -*- import wx class Application(wx.Frame): def __init__(self, par
Android多线程分析之三:Handler,Looper的实现
在前文《Android多线程分析之二:Thread的实现》中已经详细分析了Android Thread 是如何创建,运行以及销毁的,其重点是对相应 native 方法进行分析,今天我将聚焦于 Android Framework 层多线程相关的类:Handler, Looper, MessageQueue, Message 以及它们与Thread 之间的关系。可以用一个不太妥当的比喻来形容它们之间的关联:如果把 Thread 比作生产车间,那么 Looper 就是放在这车间里的生产线,这条生产线源源不断地从
MovetoThread : Widgets cannot be moved to a new thread
QThread
QT中QT Widgets Application中QWidget、QDialog及QMainWindow的区别
QWidget类是所有用户界面对象的基类。 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上绘制自己。每一个窗口部件都是矩形的,并且它们按Z轴顺序排列。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。      QMainWindow 类提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。主窗口通常用在提供一个大的中央窗口