c++ - 如何调用外部 c 函数,而 GLUT 显示循环锁定我的 c++ main?

标签 c++ c multithreading loops glut

我是新来的,对显示编程不是很熟悉。 我有一个 c 程序,每 40 毫秒调用一次 doStep 函数。在这个函数中,我有 C++ 代码,它运行过剩显示以可视化 3D 环境。 doStep 函数将我的 3D 对象的新位置信息从外部传递到我的 C++ 3D 环境中。

问题是,我的 C 代码被过剩显示循环锁定,因此我无法再更新环境中的位置。我应该为显示循环使用单独的线程来解决这个问题吗? 我知道 glutPostRedisplay() 可用于重绘我的场景,但我不知道如何分离我的显示循环以保持对 doStep 函数的控制。

提前致谢


好的,因为我的帖子不清楚并且没有代码,我会尝试指定问题。我正在使用 Nvidia OptiX Raytracing 渲染场景。视觉输出由 C++ 中的 GLUTDisplay 类创建。我为我的显示创建了一个单独的线程并将其分离,以便我可以进一步控制程序。我知道可以在线程之间共享一个类,因此我可以为显示创建一个单独的线程并在我的另一个线程中调用 GLUTDisplay::postRedisplay(); 来更新上下文。为了运行我的程序,我使用了 3 个 C 函数:

extern "C" {

extern void* create(const char* filename, double* inputArray, double* outputArray, int argc, char** argv);
extern void  trace(void* scene_obj);
extern void  exitScene(void* scene_obj);

}

这是我对它们的实现:

void * create( const char* filename, double* inputArray, double* outputArray, int argc, char** argv ){
    OptixScene* scene = new OptixScene(filename);
    scene->routeInput(inputArray);       //routing my inputs and outputs
    scene->routeOutput(outputArray);     //from a simulation model

    std::thread display_thread(&OptixScene::createDisplayThread, scene, argc, argv); // this starts the display loop
    display_thread.detach();    // detach display thread to get control back

    return (void *)scene;
}

void trace( void* scene_obj ){
    OptixScene* scene = static_cast<OptixScene*> (scene_obj);
    scene->readInputs();
    scene->updateMatrix();
    scene->renderImage();      // GLUTDisplay::postRedisplay() in here
    scene->writeOutputs();
}

void exitScene(void* scene_obj){
    OptixScene* scene = static_cast<OptixScene*> (sensor);
    try{
        scene->cleanUp();
        if (scene->getContext().get() != 0)
              {
                sutilReportError( "Scene class failed to clean up!" );
                exit(2);
              }
        exit(0);
    }
    catch( Exception& e ){
        sutilReportError( e.getErrorString().c_str() );
        exit(2);
    } 
}

一开始我调用create()一次,然后每40ms我调用一次trace()来更新我的场景。这是显示循环的安全线程实现吗?运行我的程序一段时间后,我的场景将不再自行更新。只有当我将鼠标移到窗口上时,场景才会更新。这是我的线程实现造成的吗?

最佳答案

要将 C 代码与 C++ 代码混合使用,请使用 extern 关键字。

extern "C"{
   void externalDoStep() {

    // your algorithm here

   }   
}

但是当你说你的功能被阻止时,我认为你应该这样做:

尝试将您的 doStep() 函数插入到此 GLUT 回调函数中,看看……

glutIdleFunc( doStep );

或任何其他 GLUT 回调函数。

如果您不将函数放在 GLUT 回调函数中,您的函数将不会被 GLUT 运行。

GLUT 的主要重要部分是回调。这些函数将处理在您更改窗口大小或按下某个键时生成的 GLUT 事件。

它是这样工作的。您创建自己的功能并插入这些功能 进入这些主要的 GLUT 回调函数。它们必须在 main()

   glutReshapeFunc(your reshape function);
   glutDisplayFunc(your display function);
   glutIdleFunc(your idle function);
   glutKeyboardFunc(your keyboard function);

完整代码 list :

#include <windows.h>
#include <string.h>
#include <GL\glut.h>
#include <iostream.h>
#include <fstream.h>

#pragma comment(lib, "glu32.lib")

int ii=0;
int iex=0;

extern "C"{
   void externalDoStep() {

    // your algorithm here
       iex++;
       cout<<iex<<" externalDoStep \n";
   }   
}

void doStep (void){
    // your algorithm here
  ii++;
  cout<<ii<<" doStep () is running \n";
  glutPostRedisplay();
}

void RenderToDisplay(){
    // your algorithm here   
}

void myDisplayFunction(void){
    // your algorithm here     
}

void myReshapeFunction(int w, int h){
    // your algorithm here
}

int main(){

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(800, 400);
    glutCreateWindow("dostep");
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glLineWidth(3);

    glutDisplayFunc( myDisplayFunction );
    glutReshapeFunc( myReshapeFunction );
    glutIdleFunc( doStep );
    glutMainLoop();

    return 0;
}

关于c++ - 如何调用外部 c 函数,而 GLUT 显示循环锁定我的 c++ main?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39120836/

相关文章:

java - Android 数学测验(线程操作)

.net - 我可以(安全地)在 ADO.NET 数据服务中使用 ThreadStatic 属性吗?

c++ - -fshort-wchar 和 std::wstring - 段错误

c - 构建C程序时如何解决CodeBlocks中的这个 'Multiple Definitions of'错误?

c - 在 C 中,如何确保初始化字符串的长度小于指定的长度

c# - 程序卸载时调用函数/Api

c++ - 搜索位域模板(密码本)

c++ - 使用c++的c/c++源文件的词法分析器

c++ - 无法将 char[33] 转换为 LPCTSTR,或者如果我将类型转换为 LPCTSTR,则无法获得所需的结果

java - 在Java中,当我在TextArea中使用多线程时,遇到问题