无法使用多文件程序创建SDL线程

时间:2014-07-04 13:10:46

标签: c++ multithreading c++11

我遇到了SDL线程问题所以我制作了一个小的多文件代码,以便更容易显示我的问题

标头文件

#ifndef MAINC_H_INCLUDED
#define MAINC_H_INCLUDED
#include <iostream>
#include <CONIO.H>
#include <SDL.h>
#include <SDL_thread.h>
using namespace std;
class mainc
{
    private:
        SDL_Thread* thread;
        int threadR;
        int testN=10;
    public:
        int threadF(void *ptr);
        int OnExecute();
        bool start();
};
#endif

一个文件

#include "mainc.h"
bool mainc::start() {
if(SDL_Init(SDL_INIT_EVERYTHING) < 0) {
    return false;
}
getch();
if(SDL_CreateThread(threadF, "TestThread", (void *)NULL)==NULL){
return false;
}
return true;
}

int mainc::threadF(void *ptr){
cout<<"This is a thread and here is a number: "<<testN<<endl;
return testN;
}

第二档

#include "mainc.h"

int mainc::OnExecute() {
    if(!start())
    {
        return -1;
    }
    SDL_WaitThread(thread,&threadR);
    return 0;
}

int main(int argc, char* argv[]) {
    mainc game;

    return game.OnExecute();
}

当我编译它时,我收到此错误

cannot convert 'mainc::threadF' from type 'int (mainc::)(void*)' to type 'SDL_ThreadFunction {aka int (*)(void*)}'

我挖了一下我找到了一个解决方案,但它给了我其他错误,我需要使threadF静态,但我无法访问它给我这个错误的任何变量

invalid use of member 'mainc::testN' in static member function

但是,如果我从函数中删除变量,它运行正常 现在我不知道该做什么,因为在我的游戏中我需要分享变化的变量

1 个答案:

答案 0 :(得分:0)

testN既不是类mainc的静态属性也不是公共属性,并且要做你想要做的事情,它也需要。 如果要在另一个线程体内使用类“mainc”的成员,则需要将指向“mainc”类的对象的指针传递给SDL_CreateThread:

// ...
SDL_CreateThread(threadF, "TestThread", this)
// ...

然后

int mainc::threadF(void *ptr)
{
   mainc* myMainc = (mainc*)ptr;
   myMainc->testN; // now you can use it as you need
}

请注意封装(testN实际上是私有的)