0

私はスレッドで経験を始めたばかりで、いくつかの基本を理解できません。10ミリ秒の間隔でスレッドからコンソールに書き込むにはどうすればよいですか? だから私はスレッドクラスを持っています:

public ref class SecThr
{
public:
    DateTime^ dt;
    void getdate()
    {
        dt= DateTime::Now; 
        Console::WriteLine(dt->Hour+":"+dt->Minute+":"+dt->Second); 
    }
};

int main()
{
    Console::WriteLine("Hello!");

    SecThr^ thrcl=gcnew SecThr;
    Thread^ o1=gcnew Thread(gcnew ThreadStart(SecThr,&thrcl::getdate));
}

Visual c++ 2010 c++ cli でコンパイルできません。多くのエラー C3924、C2825、C2146 が発生します。

4

1 に答える 1

1

間違った C++/CLI コードを書いているだけです。最も明白な間違い:

  • System::Threading など、使用するクラスのusing 名前空間ディレクティブがありません。System::Threading::Thread を完全に記述しない場合に必要です。
  • DateTime のような値の型で ^ ハットを使用すると、コンパイル エラーとして通知されませんが、プログラムの効率に非常に有害であり、値がボックス化されます。
  • デリゲート オブジェクトが正しく構築されていません。最初の引数はターゲット オブジェクト、2 番目の引数は関数ポインタです。

動作するように書き直します:

using namespace System;
using namespace System::Threading;

public ref class SecThr
{
    DateTime dt;
public:
    void getdate() {
        dt= DateTime::Now; 
        Console::WriteLine(dt.Hour + ":" + dt.Minute + ":" + dt.Second);
    }
};


int main(array<System::String ^> ^args)
{
    Console::WriteLine("Hello!");

    SecThr^ thrcl=gcnew SecThr;
    Thread^ o1=gcnew Thread(gcnew ThreadStart(thrcl, &SecThr::getdate));
    o1->Start();
    o1->Join();
    Console::ReadKey();
}
于 2013-09-27T13:51:10.990 に答える