Visual Studio 2015“非标准语法;使用'&'为成员创建指针“

时间:2017-03-30 08:55:48

标签: c++ multithreading pointers

在Win32应用程序中使用CreateThread()创建线程时,我收到此错误。 在CreateThread中(NULL,0,pSample-> Resize(),NULL,0,NULL);它显示函数调用中的错误。

我有几个文件:

Main.cpp的

WinMain()
 {
   //Create sample
    return Win32Appliaction::Run(&sample);
  }

Win32Application.cpp

int Win32Application::Run(DXSample* pSample)
  {
     //Create Window
     pSample->Init();
     pSample->Render();
     CreateThread(NULL,0,pSample->Resize,NULL,0,NULL);//error occurs
     pSample->Destroy();
  }

DXSample.h

class DXSample
   {
     public:
           virtual void Init() =0; //and rest all functions
   };

HelloTexture.h

 class HelloTexture:public DXSample
   {
       public : 
             virtual void Init();//all other functions similarly
    }

HelloTexture.cpp

void Hellotexture::Init()
 { //code
  } 
 void Hellotexture::Resize()
 {
    //code 
  }

2 个答案:

答案 0 :(得分:0)

您正在调用 pSample->Resize()函数,将返回的值作为要运行的函数传递给CreateFunction

如果你想让Resize函数在自己的线程中运行,你需要做两件事:

  1. 将指针传递给函数,例如&HelloTexture::Resize
  2. 制作函数static
  3. 第一点是将指向函数本身的指针传递给CreateThreadpSample->Destroy()将创建线程并从新线程调用函数。

    第二点是因为非静态成员函数需要一个对象,即要调用的类的实例

    您的代码还有另一个问题。请记住,线程彼此并行运行。如果您创建一个线程,它将独立于其他线程运行。这意味着您使用的对象及其所有数据必须保持活动状态,直到线程结束。

    我提出这个问题是因为你似乎想要创建线程,然后立即拨打<select><option>,这就像从其他人脚下拉出地毯一样。

    你真的想在这里创建一个帖子吗?

答案 1 :(得分:0)

CreateThread的参数#2必须是指向匹配ThreadProc签名的函数的指针。您不能传递pSample-&gt; Resize()(无效)的结果或指向Resize函数本身的指针(因为这是一个非静态类成员函数)。您也可以使用:: std :: thread而不是直接调用WinApi。