gpt4 book ai didi

multithreading - 使用 win32 线程的 C++/CLI 引用类

转载 作者:行者123 更新时间:2023-12-03 12:57:56 25 4
gpt4 key购买 nike

我正在尝试将一些较旧的 win32 代码封装在 C++/CLI 引用类中,以便更好地从 .NET 代码访问它。这个类需要启动一个 Win32 线程,并将一个指向该类的指针作为线程参数传递。代码如下所示:

ref class MmePlayer
{
int StartPlayback()
{
hPlayThread = CreateThread(NULL, 0, PlayThread, this, 0, &PlayThreadId);
}
};

static DWORD WINAPI PlayThread(LPVOID pThreadParam)
{
// Get a pointer to the object that started the thread
MmePlayer^ Me = pThreadParam;
}

该线程确实需要是 Win32 线程,因为它从 MME 子系统接收消息。我尝试将 PlayThread 函数指针包装在 internal_ptr 中,但编译器不允许这样做。
此外,我试图使线程函数成为类方法,但编译器不允许在 ref 类方法上使用 _stdcall 修饰符。
你知道处理这个问题的方法吗?

最佳答案

托管类使用“句柄”而不是引用来传递。您不能将托管类的句柄视为指针。您要做的是创建一个 native 助手类,该类保存托管类的句柄。然后将指向 native 助手的指针传递给线程启动函数。像这样:

#include <msclr/auto_gcroot.h>
using msclr::auto_gcroot;

ref class MmePlayer;

class MmeHelper
{
auto_gcroot<MmePlayer^> myPlayer;
};

ref class MmePlayer
{
int StartPlayback()
{
myHelper = new MmeHelper();
myHelper->myPlayer = this;
hPlayThread = CreateThread(NULL, 0, PlayThread, myHelper, 0, &PlayThreadId);
}

MmeHelper * myHelper;
};

static DWORD WINAPI PlayThread(LPVOID pThreadParam)
{
// Get a pointer to the object that started the thread
MmeHelper* helper = pThreadParam;
}

关于multithreading - 使用 win32 线程的 C++/CLI 引用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1404732/

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