我们正在为我们的硬件传感器套件实施许多SDK。C++ DLL - 跨线程回调
成功为我们的传感器获得了一个可用的C API后,我们现在开始测试SDK的艰巨任务,以确保我们没有引入任何致命错误,内存泄漏或竞争条件。
我们的一位工程师报告说,在开发测试应用程序(Qt Widgets应用程序)时,挂钩到从DLL内的单独线程执行的回调时发生了问题。
这里是回调原型:
#define API_CALL __cdecl
typedef struct {
// msg fields...
DWORD dwSize;
// etc...
} MSG_CONTEXT, *PMSG_CONTEXT;
typedef void (API_CALL *SYS_MSG_CALLBACK)(const PMSG_CONTEXT, LPVOID);
#define API_FUNC __declspec(dllexport)
API_FUNC void SYS_RegisterCallback(SYS_MSG_CALLBACK pHandler, LPVOID pContext);
而且它附着在Qt的如下:
static void callbackHandler(const PMSG_CONTEXT msg, LPVOID context) {
MainWindow *wnd = (MainWindow *)context;
// *wnd is valid
// Call a function here
}
MainWindow::MainWindow(QWidget *parent) {
SYS_RegisterCallback(callbackHandler, this);
}
我的问题是:是回调对创造或线程上执行执行它的线程?无论哪种情况,我都需要某种同步方法。谷歌搜索导致了大量的C#示例,这并不是真正需要的。
正在考虑的一件事是使用SendMessage
或PostMessage
函数,而不是沿着回调路线。
任何人都可以提供任何建议,请问如何使用回调来实现跨线程安全?或者,消息泵路由是否适用于基于Windows的SDK?
“我的问题是:是在创建它的线程还是在执行它的线程上执行的回调?”这对你自己来说是微不足道的 - 在回调函数内部保留一个断点,并在调试器击中它时查看你所在的线程。 – MrEricSir
@MrEricSir,道歉 - 我当时没有在调试代码,而是另一位工程师。但是,是的,这可能是微不足道的发现。 – weblar83