gpt4 book ai didi

c++-cli - 将参数传递给 C++/CLI 中的任务?

转载 作者:行者123 更新时间:2023-12-04 00:02:06 26 4
gpt4 key购买 nike

我在 Visual Studio 2012 中有这个 C# 代码。

public Task SwitchLaserAsync(bool on)
{
return Task.Run(new Action(() => SwitchLaser(on)));
}

这将执行 SwitchLaser方法(类 MyClass 的公共(public)非静态成员)作为带有 bool 参数的任务。

我想在托管 C++/CLI 中做类似的事情。但是我无法找到如何运行任务的任何方法,该任务将执行一个采用一个参数的成员方法。

目前的解决方案是这样的:
Task^ MyClass::SwitchLaserAsync( bool on )
{
laserOn = on; //member bool
return Task::Run(gcnew Action(this, &MyClass::SwitchLaserHelper));
}
SwitchLaserHelper的实现功能:
void MyClass::SwitchLaserHelper()
{
SwitchLaser(laserOn);
}

必须有一些像 C# 这样的解决方案,而不是创建辅助函数和成员(这不是线程安全的)。

最佳答案

目前还没有任何方法可以做到这一点。

在 C# 中,您有一个闭包。在编写 C++/CLI 编译器时,仍在讨论 C++ 中闭包的标准化语法。值得庆幸的是,微软选择等待并使用标准的 lambda 语法,而不是引入另一种独特的语法。不幸的是,这意味着该功能尚不可用。如果是,它看起来像:

gcnew Action([this, on](){ SwitchLaser(on) });

当前的线程安全解决方案是做 C# 编译器所做的事情——不将辅助函数和数据成员放入当前类,而是放入嵌套子类型。当然你需要保存 this除了本地变量之外的指针。
ref class MyClass::SwitchLaserHelper
{
bool laserOn;
MyClass^ owner;

public:
SwitchLaserHelper(MyClass^ realThis, bool on) : owner(realThis), laserOn(on) {}
void DoIt() { owner->SwitchLaser(laserOn); }
};

Task^ MyClass::SwitchLaserAsync( bool on )
{
return Task::Run(gcnew Action(gcnew SwitchLaserHelper(this, on), &MyClass::SwitchLaserHelper::DoIt));
}

C++ lamdba 语法将为您简单地创建该帮助程序类(目前它适用于 native lambda,但不适用于托管 lambda)。

关于c++-cli - 将参数传递给 C++/CLI 中的任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13071753/

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