0

デスクトップ用の UI 抽象化レイヤーを作成しています。現在、.NET フレームワークの機能を実装しています。厄介なことに、ユーザーに Visual Studio で CLR Windows フォーム アプリケーションをstd::thread作成させると、標準ライブラリをすべて使用することができず、別の種類のアプリケーションを作成させると、コンソールが表示されます。

clrを使用する方法はありますstd::threadか、またはさらに良いことに、CLR コンソールまたは CLR 空のプロジェクトでコンソールが起動しないようにする (または画面とタスクバーの両方から非表示にする) 方法があります。

ありがとう

4

2 に答える 2

1

古い質問かもしれませんが、以前に同じ問題を調べました。CLR ではコンパイル時にインクルードできないためstd::thead、リンク時にのみ使用することができます。通常、ヘッダーでクラスを前方宣言し、それらを cpp ファイルにのみ含めることで、これを解決できます。ただし、ヘッダー ファイルで独自のクラスを前方宣言することはできますが、名前空間 std のクラスを宣言することはできません。C++11 標準 17.6.4.2.1 によると:

特に指定がない限り、名前空間 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「手頃な価格」で実用的な代替品です (プロジェクトでブーストを使用できる場合)。奇妙なことに、非互換性をバイパスします。

于 2014-03-18T13:18:23.200 に答える