QT中使用THUNK技术实现回调问题
2011-03-01 18:46
381 查看
C++中使用回调,考虑了多种都不行,感觉不能达到自己的要求。搜索资料看到THUNK技术,貌似在基于对象实现回调这一块用的很广泛。看了看大致原理,的确不错。把成员函数的调用原理加以分析,相对应的寄存器写入this指针的值。THUNK形成汇编代码块,调用底层指令,对相应的寄存器操作。这些操作也就是基本模仿成员函数调用时的操作,实现成员函数的调用。大致这样吧,按照网上的方法,其实是能够达到效果的。但是总会有问题啊,而且很郁闷。
lpCopy即为回调函数指针,通过m_thunk绑定好this指针的。
问题:直接在本类中调用时可以的,而网上很多也就仅做到这一步;而在外部接口中调用的话,就会出错,其实是他会修改当前类的一些信息。就像我遇到的问题,在后面回调成功以后,都会回调成功。但是第一种情况下emit消息是不会有问题的,而第二种方式emit消息就会出现问题了。1、两次会回调对寄存器的操作是不一样的,但是我不是很明白太底层的操作。2、具体追踪是在emit时两次所对应的sender发射者的内部成员也不同。具体是connectionList—>Inuser有问题。现在是只知道问题了,但是具体应该如何操作还不是很明白,一天下来把人郁闷死了。
明天继续吧,看看能不能解决问题。
THUNK技术也是值得研究一下的,貌似有很多学问在里边,一些底层的东西也应该好好温习一下了,以前还学过,不用就全给忘了。
m_thunk.Init(pointer_cast<int>(&MyThread::CopyProgressRoutine), this); LPCopyProgressRoutine lpCopy; lpCopy = (LPCopyProgressRoutine)&m_thunk; lpCopy(4, 3, 2, L"gderg");//直接在本类中调用 for(tracing = 0; tracing <= index; tracing++) { CFileDir = new CFileDirectory(reinterpret_cast<const wchar_t*>(Path[tracing].SrcPath.utf16()), reinterpret_cast<const wchar_t *>(Path[tracing].DestPath.utf16())); CFileDir->CopyDirEx(lpCopy);//传递给外面的接口,在外部类中调用 }
lpCopy即为回调函数指针,通过m_thunk绑定好this指针的。
问题:直接在本类中调用时可以的,而网上很多也就仅做到这一步;而在外部接口中调用的话,就会出错,其实是他会修改当前类的一些信息。就像我遇到的问题,在后面回调成功以后,都会回调成功。但是第一种情况下emit消息是不会有问题的,而第二种方式emit消息就会出现问题了。1、两次会回调对寄存器的操作是不一样的,但是我不是很明白太底层的操作。2、具体追踪是在emit时两次所对应的sender发射者的内部成员也不同。具体是connectionList—>Inuser有问题。现在是只知道问题了,但是具体应该如何操作还不是很明白,一天下来把人郁闷死了。
明天继续吧,看看能不能解决问题。
THUNK技术也是值得研究一下的,貌似有很多学问在里边,一些底层的东西也应该好好温习一下了,以前还学过,不用就全给忘了。
相关文章推荐
- MFC使用CEF并实现js与C++交互功能,解决Render进程中OnContextCreated绑定与OnWebKitInitialized的js扩展无法回调问题
- 任何国家都无法限制数字货币。为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用 c.分布式算法的实现 d.数据存储技术 e.拜占庭算法 f.权益证明POW,POS,DPOS 原因一: 点对点网络设计 其中点对点的P2P网络是bittorent ,由于是点对点的网络,没有中心化,因此在全球分布式的网
- 任何国家都无法限制数字货币。为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用 c.分布式算法的实现 d.数据存储技术 e.拜占庭算法 f.权益证明POW,POS,DPOS 原因一: 点对点网络设计 其中点对点的P2P网络是bittorent ,由于是点对点的网络,没有中心化,因此在全球分布式的网
- 设计模式学习(十四)————抽象工厂模式(使用Qt框架的反射技术——根据字符串动态创建类来实现)
- MFC使用CEF并实现js与C++交互功能,解决Render进程中OnContextCreated绑定与OnWebKitInitialized的js扩展无法回调问题
- 使用钩子技术实现QT中的全局热键
- 使用Qt Visual Studio Add-in 实现中文ts文件,解决中文乱码问题
- android使用友盟实现第三方登录、分享以及微信回调无反应问题解决办法
- 使用纯net技术实现抓屏(包含连续抓图和鼠标的问题的解决方法)
- iOS 使用科大讯飞技术实现语音转文字(语音听写)
- 使用无刷新技术,去请求该失效Session的页面,实现跳转到重新登陆页面。
- 使用Commons net实现FTP上传文件(网络问题无响应解决方案)
- 使用tensorflow实现简单的多分类问题
- 使用HTML5中postMessage实现Ajax中的POST跨域问题
- 使用QT实现简单艺术字
- VC 绘图,使用双缓冲技术实现
- 什么是thunk技术实现?
- 使用OpenCV 实现多摄像头图像处理笔记(1):DirectShow的配置过程可能出现的问题
- Win10技术预览版下载安装和使用问题
- 使用OData技术遇到的问题及解决办法