Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Visual Studio 2015“;非标准语法;使用'&';为成员创建指针”;_C++_Multithreading_Pointers - Fatal编程技术网

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

C++ Visual Studio 2015“;非标准语法;使用'&';为成员创建指针”;,c++,multithreading,pointers,C++,Multithreading,Pointers,在Win32应用程序中使用CreateThread()创建线程时,我遇到此错误。 在CreateThread中(NULL,0,pSample->Resize(),NULL,0,NULL);它显示函数调用中的错误 我有以下几个文件: Main.cpp WinMain() { //Create sample return Win32Appliaction::Run(&sample); } int Win32Application::Run(DXSample* pSamp

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

我有以下几个文件:

Main.cpp

WinMain()
 {
   //Create sample
    return Win32Appliaction::Run(&sample);
  }
int Win32Application::Run(DXSample* pSample)
  {
     //Create Window
     pSample->Init();
     pSample->Render();
     CreateThread(NULL,0,pSample->Resize,NULL,0,NULL);//error occurs
     pSample->Destroy();
  }
void Hellotexture::Init()
 { //code
  } 
 void Hellotexture::Resize()
 {
    //code 
  }
Win32Application.cpp

WinMain()
 {
   //Create sample
    return Win32Appliaction::Run(&sample);
  }
int Win32Application::Run(DXSample* pSample)
  {
     //Create Window
     pSample->Init();
     pSample->Render();
     CreateThread(NULL,0,pSample->Resize,NULL,0,NULL);//error occurs
     pSample->Destroy();
  }
void Hellotexture::Init()
 { //code
  } 
 void Hellotexture::Resize()
 {
    //code 
  }
DXSample.h

class DXSample
   {
     public:
           virtual void Init() =0; //and rest all functions
   };
 class HelloTexture:public DXSample
   {
       public : 
             virtual void Init();//all other functions similarly
    }
HelloTexture.h

class DXSample
   {
     public:
           virtual void Init() =0; //and rest all functions
   };
 class HelloTexture:public DXSample
   {
       public : 
             virtual void Init();//all other functions similarly
    }
HelloTexture.cpp

WinMain()
 {
   //Create sample
    return Win32Appliaction::Run(&sample);
  }
int Win32Application::Run(DXSample* pSample)
  {
     //Create Window
     pSample->Init();
     pSample->Render();
     CreateThread(NULL,0,pSample->Resize,NULL,0,NULL);//error occurs
     pSample->Destroy();
  }
void Hellotexture::Init()
 { //code
  } 
 void Hellotexture::Resize()
 {
    //code 
  }
您正在调用
pSample->Resize()
函数,将返回的值作为要运行的函数传递给
CreateFunction

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

  • 将指针传递给函数,例如
    &HelloTexture::Resize
  • 使函数
    为静态
  • 第一点是将指向函数本身的指针传递给
    CreateThread
    ,后者将创建线程并从新线程调用函数

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


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

    我之所以提出这个问题,是因为您似乎想要创建线程,然后立即调用
    pSample->Destroy()
    ,这就像从其他人的脚下拉出地毯一样


    是否确实要在此处创建线程?

    CreateThread的参数#2必须是指向匹配签名的函数的指针。您不能将pSample->Resize()的结果(它是空的)或指针传递给Resize函数本身(因为这是一个非静态类成员函数)。另外,您可能希望使用::std::thread,而不是直接调用WinApi。

    是的,有两种不同的情况发生。我想创建一个线程来调整图像缓冲区的大小,并将其存储起来,与我想渲染的图形并行。pSample->Destroy()调用只销毁显示窗口,而不销毁其他内容。感谢您提出的编辑建议。我两个都试过了。第一个显示错误。它说void(*)类型的参数与LPTHREAD\u START\u例程不兼容。对于第二点,“pSample”用于调用函数。这一定是一个必要的功能static@shero_don你是说你会用同样的数据同时做两件可能有冲突的事情吗?
    调整大小
    的作用是什么?您不应该先调用它,然后以串行方式进行渲染吗?你展示的小代码毫无意义,特别是作为线程。我已经创建了数据的副本。一个正在调整大小,另一个用于渲染。我尝试使用std::thread,它不适用于win32应用程序。切换到CreateThread()。您可以建议对程序进行编辑以使其正常工作吗?std::thread对于win32应用程序应该可以正常工作,但是如果您仍然想使用CreateThread,那么您的线程入口点应该类似于DWORD WINAPI ResizeThreadProc(LPVOID lpParameter){static_cast(lpParameter)->Resize();}在创建线程CreateThread(NULL,0,&ResizeThreadProc,pSample,0,NULL)时,将指向DXSample的指针作为参数#3传递;