我想从在本机 dll 中创建的线程对我的托管包装器进行回调,我已经成功创建了我的线程并通过 Qt.s 框架信号和插槽进行了调用。
如何在非托管和托管 dll 之间从单独的线程向主线程进行回调?非托管在 QT c++ 中完成,通过 VS c++ 进行管理。
非托管 dll:main.cpp
typedef void (__stdcall * processCallback)(char*, int, int);
Thread* thread;
EXTEXPORT_VOID initdll(processCallback callback)
{
/* Init MainThread - Runs eventloop */
thread = new Thread(callback);
thread ->start();
}
thread.h - 运行方法,我在这里进行回调,但回调在我的新线程中继续,而不是在我的托管 dll 中创建它的主线程。为什么?
void run() {
callback("Testing callback", 0, 0);
exec();
}
我需要这个回调是我的主线程,而不是我现在正在运行的线程。
托管 dll
/* From unmanaged to managed c++ */
[UnmanagedFunctionPointerAttribute(CallingConvention::StdCall)]
public delegate void UnmanagedCallbackDelegate(char*, int, int);
typedef void (__stdcall * typeCallback)(char*, int, int); //Same def as in Unm. dll
public ref class cDLLThreadWrapper
{
[DllImport("cDLL.dll", CallingConvention=CallingConvention::StdCall)]
static void initdll(typeCallback);
public:
typeCallback callbackNative;
UnmanagedCallbackDelegate^ m_CallbackDelegate;
cDLLThreadWrapper()
{
}
void init()
{
m_CallbackDelegate = gcnew UnmanagedCallbackDelegate(this, &cDLLThreadWrapper::UnhandledCallback);
IntPtr ptr = Marshal::GetFunctionPointerForDelegate(m_CallbackDelegate);
callbackNative = static_cast<typeCallback>(ptr.ToPointer());
initdll(callbackNative);
}
void UnhandledCallback(char* data, int x, int y)
{
String^ callStr = gcnew String(data);
//AppDomain.GetCurrentThreadId())
//I get here but the thread is wrong, it should be the main thread
//which called the initdll function from this wrapper.
}
}
正如我所说的回调有效,但由于某种原因我在错误的线程中得到它,回调不应该来自线程1 - >主线程吗?
这是一个非常简化的示例,但具体问题是为什么我的回调没有从新创建的线程转到主线程,而是留在新创建的线程中。我在哪里想错了?任何帮助表示赞赏!