我遇到了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
但是,如果我从函数中删除变量,它运行正常 现在我不知道该做什么,因为在我的游戏中我需要分享变化的变量
答案 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实际上是私有的)