【问题标题】:Thread Programming in C++/CLRC++/CLR 中的线程编程
【发布时间】:2013-07-10 15:18:07
【问题描述】:

我在 Visual C++/CLR 中的线程编程方面遇到了困难。我已经搜索了很多,并在互联网上找到了很多材料,包括官方资源,但我仍然感到困惑。 C++/CLR 的资源很少。其中大多数是用于 C# 或旧式 C++ 的。我尝试运行这个简单的代码。我选择了一个 clr 控制台应用程序类型的新项目并将以下代码放在那里,但我遇到了我不理解的错误。

// thread_clr.cpp : main project file.

#include "stdafx.h"

using namespace System;
using namespace System;
using namespace System::Threading;
class MessagePrinter;

// class ThreadTester demonstrates basic threading concepts
class ThreadTester
{
    static int Main()
    {
        // Create and name each thread. Use MessagePrinter's
        // Print method as argument to ThreadStart delegate.
        MessagePrinter printer1 = gcnew MessagePrinter();
        Thread thread1 = gcnew Thread ( gcnew ThreadStart( printer1.Print ) );
        thread1.Name = "thread1";

        MessagePrinter printer2 = gcnew MessagePrinter();
        Thread thread2 = gcnew Thread ( gcnew ThreadStart( printer2.Print ) );
        thread2.Name = "thread2";

        MessagePrinter printer3 = gcnew MessagePrinter();
        Thread thread3 = gcnew Thread ( gcnew ThreadStart( printer3.Print ) );
        thread3.Name = "thread3";

        Console.WriteLine( "Starting threads" );
        // call each thread's Start method to place each
        // thread in Started state
        thread1.Start();
        thread2.Start();
        thread3.Start();

        Console.WriteLine( "Threads started\n" );
    } // end method Main
}; // end class ThreadTester

class MessagePrinter
{
    private int sleepTime;
    private static Random random = gcnew Random();

    // constructor to initialize a MessagePrinter object
    public MessagePrinter()
    {
        // pick random sleep time between 0 and 5 seconds
        sleepTime = random.Next( 5001 );
    }

    //controls Thread that prints message
    public void Print()
    {
        // obtain reference to currently executing thread
        Thread current = Thread.CurrentThread;

        // put thread to sleep for sleepTime amount of time
        Console.WriteLine(current.Name + " going to sleep for " + sleepTime );

        Thread.Sleep ( sleepTime );

        // print thread name
        Console.WriteLine( current.Name + " done sleeping" );

    } // end method Print
} // end class MessagePrinter

请帮忙。或者更好的是,请指导我一些教程或其他影响。我知道 SO 不是一个教程网站,我也不是在问一个,但如果有人能至少指出 C++/CLR 线程的资源,我将不胜感激。 C++/CLR Winform 线程。真的很感激

问候

一些错误是:

'printer1' 使用未定义的类 'MessagePrinter' 'Print' : 不是 'System::Int32' 'System::Threading::ThreadStart' 的成员:a 委托构造函数需要 2 个参数 'System::Threading::Thread::Thread' : 没有合适的默认值 可用的构造函数'System::Threading::Thread::Thread':否 适当的默认构造函数可用'语法错误:'int'应该 前面有':''不能在非托管中声明托管'随机' 'MessagePrinter' 不能声明全局或静态变量,或者 引用 gc 堆中对象的本机类型的成员 'MessagePrinter::random' : 你不能嵌入引用的实例 在本机类型 'MessagePrinter::random' 中键入 'System::Random' : 只有静态 const 整数数据成员可以在 类 'MessagePrinter' 前面应该有 ':' 'void' 应该是 前面有':'

【问题讨论】:

  • 那么你得到了什么错误?我怀疑你会在这里找到读心者,更不用说通过互联网阅读其他人的屏幕输出了。
  • @nvoigt...抱歉,这是我的恼怒,我大喊大叫,因为我在过去 1 天半的时间里被困在这里...更新了问题

标签: multithreading winforms visual-c++ c++-cli clr


【解决方案1】:

我已为您修复了该代码,但让我先说一件事:您确实需要先学习基础知识。这甚至不是 C++/CLI 代码,您没有找到或无法修复最明显的语法错误。暂时忘记线程,它们很难。先学习基础知识。

#include "stdafx.h"

using namespace System;
using namespace System::Threading;

ref class MessagePrinter
{
private:
    int sleepTime;
    static Random^ random = gcnew Random();

// constructor to initialize a MessagePrinter object
public:
    MessagePrinter()
    {
        // pick random sleep time between 0 and 5 seconds
        sleepTime = random->Next( 5001 );
    }

    //controls Thread that prints message
    void Print()
    {
        // obtain reference to currently executing thread
        Thread^ current = Thread::CurrentThread;

        // put thread to sleep for sleepTime amount of time
        Console::WriteLine(current->Name + " going to sleep for " + sleepTime );

        Thread::Sleep ( sleepTime );

        // print thread name
        Console::WriteLine( current->Name + " done sleeping" );

    } // end method Print
}; // end class MessagePrinter  

int main()
{
    // Create and name each thread. Use MessagePrinter's
    // Print method as argument to ThreadStart delegate.
    MessagePrinter^ printer1 = gcnew MessagePrinter();
    Thread^ thread1 = gcnew Thread(gcnew ThreadStart( printer1, &MessagePrinter::Print ) );
    thread1->Name = "thread1";

    MessagePrinter^ printer2 = gcnew MessagePrinter();
    Thread^ thread2 = gcnew Thread ( gcnew ThreadStart( printer2, &MessagePrinter::Print ) );
    thread2->Name = "thread2";

    MessagePrinter^ printer3 = gcnew MessagePrinter();
    Thread^ thread3 = gcnew Thread ( gcnew ThreadStart( printer3, &MessagePrinter::Print ) );
    thread3->Name = "thread3";

    Console::WriteLine( "Starting threads" );
    // call each thread's Start method to place each
    // thread in Started state
    thread1->Start();
    thread2->Start();
    thread3->Start();

    Console::WriteLine( "Threads started\n" );
    Console::ReadLine();

    return 0;
}

【讨论】:

    【解决方案2】:

    请注意,您离开了 Main 函数,因此所有线程都将被终止...所以在“main”的最后一行放置一个 Console.ReadLine()...

    另外:您的源代码是 C# 而不是 C++/CLI...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 2013-04-24
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多