我們正在爲我們的硬件傳感器套件實施許多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