如何在c ++中创建glfw线程?

时间:2013-05-15 09:04:50

标签: c++ multithreading glfw

我刚刚开始使用glfw尝试构建游戏。我是C和C ++的新手,但我之前使用的是openGL for android。我已经完成了所有的openGL工作,现在开始尝试用glfw创建一个线程。

这是一些基本的测试代码。它类似于文档中的内容。

#include <GL/glfw.h>
#include <stdio.h>

GLFWthread thread;

void GLFWCALL testThread()
{
    printf("hello\n");
}

int main()
{
    printf("test\n");

    glfwInit();

    thread = glfwCreateThread(testThread, NULL);
    glfwWaitThread(thread, GLFW_WAIT);

    glfwTerminate();
    return 1;   
}

这将在gcc中正常编译并且可以像预期的那样工作。

$ gcc -o glthread glthread.c -lglfw
$ ./glthread
test
hello

问题是我想利用类似c ++的功能是我的游戏。当我用g ++编译时,我得到了这个......

$ g++ -o glthread glthread.c -lglfw
glthread.c: In function ‘int main()’:
glthread.c:18: error: invalid conversion from ‘void (*)()’ to ‘void (*)(void*)’
glthread.c:18: error:   initializing argument 1 of ‘GLFWthread glfwCreateThread(void (*)(void*), void*)’

当我把它放在一个类中时,关键错误就会改变。

error: argument of type ‘void (Renderer::)()’ does not match ‘void (*)(void*)’

我基本上想知道的是,是否可以在c ++中使用glfw创建线程,如果是这样的话?

我的主要PC工作是一台arch linux机器。我现在不能给我的编译器版本。如果它能帮助我以后再拿到它们。

1 个答案:

答案 0 :(得分:1)

void GLFWCALL testThread()
{
    printf("hello\n");
}

应该接收一个void*类型的参数,并且你不能在这里使用类函数,因为指向类函数的指针是Ret (Class::*)(args),而不是void (*)(void*)。如果你想使用带有线程的类成员的指针 - 你应该使用更多的C ++样式库(boost::thread或类似的东西,或者编写你自己的包装器。)

你的例子在C中工作,因为在C中空括号(即())表示 - 任何类型的任意数量的参数,但在C ++()中意味着,该函数根本不接收参数。