0

我正在为桌面创建一个 UI 抽象层。现在我正在实现 .NET 框架的功能。烦人的事情是,如果我让用户在 Visual Studio 中创建 CLR Windows 窗体应用程序,他们将无法使用所有标准库std::thread,如果我让他们创建另一种类型的应用程序,控制台就会出现。

有没有办法将clrstd::threadCLR 控制台或 CLR 空项目一起使用,或者更好的是,有没有办法阻止控制台启动(或从屏幕和任务栏隐藏它)。

谢谢

4

2 回答 2

1

可能是一个老问题,但我之前研究过同样的问题。由于 CLR 不允许您std::thead在编译时包含,您可以尝试仅在链接时使用它。通常,您可以通过在标题中声明该类并将它们仅包含在您的 cpp 文件中来解决此问题。但是,您可以在头文件中转发声明自己的类,但不能为命名空间 std 中的类。根据 C++11 标准,17.6.4.2.1:

如果 C++ 程序将声明或定义添加到命名空间 std 或命名空间 std 内的命名空间,则 C++ 程序的行为是未定义的,除非另有说明。

此问题的解决方法是创建一个继承自std::thread可以转发声明的线程类。此类的头文件如下所示:

#pragma once
#include <thread>
namespace Threading
{
    class Thread : std::thread
    {
    public:
        template<class _Fn, class... _Args> Thread(_Fn fn, _Args... args) : std::thread(fn, std::forward<_Args>(args)...)
        {

        }
    private:

    };
}

在你想使用线程的头文件中,你可以像这样向前声明它:

#pragma once

// Forward declare the thread class 
namespace Threading { class Thread; }
class ExampleClass
{
    public:
        ExampleClass();
        void ThreadMethod();
    private:
        Threading::Thread * _thread;
};

在您的源文件中,您可以使用 theading 类,如:

#include "ExampleClass.h"
#include "Thread.h"

ExampleClass::ExampleClass() :
{
    _thread = new Threading::Thread(&ExampleClass::ThreadMethod, this);
}

void ExampleClass::ThreadMethod()
{
}

希望它可以帮助任何人。

于 2017-11-06T11:56:37.487 回答
0

这是一个老问题,但如果有人遇到同样的问题:boost::thread是“负担得起”且实用的替代品(前提是您可以在项目中使用 boost)。奇怪的是,它绕过了不兼容。

于 2014-03-18T13:18:23.200 回答