gpt4 book ai didi

c++ - 从非托管 dll 中的 QThread 回调到托管 C++ 主线程

转载 作者:行者123 更新时间:2023-11-28 07:59:05 25 4
gpt4 key购买 nike

我想从在 native 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 - run 方法,我在这里进行回调,但回调在我的新线程中继续,而不是在我的托管 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 -> 主线程吗?

这是一个非常简化的示例,但具体问题是为什么我的回调不会从我新创建的线程转到主线程,而是停留在新创建的线程中。我哪里想错了?任何帮助表示赞赏!

最佳答案

您将回调作为直接调用执行,有什么让您感到惊讶的吗?如果您在 Qt 中执行 callback(...),它也会在您的新线程中执行并继续。这等效于使用 Qt::DirectConnection 类型声明信号槽连接。 Qt 很聪明,当调用线程和目标线程不同时,它会在幕后为您执行Qt::QueuedConnection。但是为了让它自动工作,源必须声明为 signal,目标必须声明为 slot,目标必须是 QThread,运行特定于 Qt 的事件循环。你有“一些”事件循环在你的托管 C++ 中运行,但 Qt 不知道如何以及在那里发布什么。绝对不是 QObject 元数据,您的 .NET C++ 不会理解它。 Qt 魔法只在 Qt 内部起作用。您必须找出具体事件是如何发布到您的 .NET C++ 并教您的 Qt 代码执行此操作的。我不是 .NET 专家,但以下内容看起来很有用

How to map Qt Signal to Event in Managed C++ (C++/CLI)

关于c++ - 从非托管 dll 中的 QThread 回调到托管 C++ 主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11970175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com