【问题标题】:Define Threads in Visual Studio 2010在 Visual Studio 2010 中定义线程
【发布时间】:2011-11-27 11:33:58
【问题描述】:

我想在 Visual Studio 2010 中创建一个包含 2 个线程的 C++ 应用程序:

  1. 从外部文件中读取数据
  2. 将数据写入外部文件

我已经阅读了有关线程的理论,但并不真正了解如何使用它。有没有人可以告诉我如何在 Visual Studio 2010 中简单地定义和运行这两个线程?

目前我有以下不起作用的示例:

class Thread
{
   public:
      Thread();
      int Start(void * arg);
   protected:
      int Run(void * arg);
      static void * EntryPoint(void*);
      virtual void Setup();
      virtual void Execute(void*);
      void * Arg() const {return Arg_;}
      void Arg(void* a){Arg_ = a;}
   private:
      THREADID ThreadId_;
      void * Arg_;

};

Thread::Thread() {}

int Thread::Start(void * arg)
{
   Arg(arg); // store user data
   int code = thread_create(Thread::EntryPoint, this, & ThreadId_);
   return code;
}

int Thread::Run(void * arg)
{
   Setup();
   Execute( arg );
}

/*static */
void * Thread::EntryPoint(void * pthis)
{
   Thread * pt = (Thread*)pthis;
   pt->Run( pt->Arg() );
}

virtual void Thread::Setup()
{  
    // Do any setup here
}

virtual void Thread::Execute(void* arg)
{
        // Your code goes here
}

我也愿意提供好的教程或代码示例。

【问题讨论】:

  • 它是否编译和链接?如果是,它在哪里失败?
  • 不,它不编译,因为必须包含一些头文件,但我不知道是哪个
  • Start() 方法是从程序的启动代码中调用的吗? (例如来自静态声明对象的构造函数?)
  • 编写包装器的麻烦在于,如果包装器不是底层 api 的好模型,您将陷入困境。线程的入口点必须是静态函数。要么根本不使用包装器,这是了解线程如何工作的好方法,要么使用其他人的包装器,例如 boost::thread。

标签: c++ visual-studio-2010


【解决方案1】:

如果程序无法编译,则应包含http://www.MSDN.com 中指定的未定义函数的标头。还要确保线程不是从 DLL 入口点(例如 DllMain())启动的。

此外,您应该在启用多线程的情况下进行编译(我相信它是 /MT 选项)。

【讨论】:

    猜你喜欢
    • 2012-01-19
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2013-08-03
    • 1970-01-01
    相关资源
    最近更新 更多