C++ 集成C++;OpenGL项目与另一个C++;项目

C++ 集成C++;OpenGL项目与另一个C++;项目,c++,opengl,main,C++,Opengl,Main,我正在处理一个项目,该项目读取数据文件,执行一些计算,并在标准输出上显示结果。后来,我想为结果提供一个三维图形视图,所以我制作了一个新的OpenGL项目,将数据显示为三维对象 现在的问题是,我想不出一种方法来集成这两个独立的项目,因为我的OpenGL项目中的main()进入了一个非终止的glutMainLoop()循环,我想不出在我的第一个项目的main()中把循环放在哪里 /**** Proj1 ****/ int main() { while(ESC key not presse

我正在处理一个项目,该项目读取数据文件,执行一些计算,并在标准输出上显示结果。后来,我想为结果提供一个三维图形视图,所以我制作了一个新的OpenGL项目,将数据显示为三维对象

现在的问题是,我想不出一种方法来集成这两个独立的项目,因为我的OpenGL项目中的
main()
进入了一个非终止的
glutMainLoop()
循环,我想不出在我的第一个项目的
main()
中把循环放在哪里

/**** Proj1 ****/
int main()
{  
    while(ESC key not pressed)
    {
        // read data file
        // do some processing
        // show results on standard output
    }
} 

/**** Proj2 ****/
int main()
{
    glutInit(&argc, argv);
    Init();
    glutDisplayFunc(Display);
    glutKeyboardFunc(Keyboard);
    glutMouseFunc(Mouse);
    glutIdleFunc(Idle);
    glutMainLoop();
}
要求Proj1和Proj2之间的代码混合最少。 是否可以执行以下操作:

/**** Proj1 ****/
#include <filesFromProj2>
int main()
{
    while(ESC key not pressed)
    {
          // read data file
          // do some processing
          proj2.showResult(result)   // how to do this ?
    }
}
/**Proj1****/
#包括
int main()
{
while(未按ESC键)
{
//读取数据文件
//做一些处理
proj2.showResult(result)//如何执行此操作?
}
}

最简单的解决方案是抛弃GLUT,使用OpenGL窗口框架实现事件循环。GLFW将是直接的选择。然后,在stdio处理旁边调用
glfwPollEvents
,而不是使用从不返回的不透明的
glutMainLoop

最简单的解决方案是抛弃GLUT,使用OpenGL窗口框架来实现事件循环。GLFW将是直接的选择。然后在stdio处理旁边调用
glfwPollEvents
,而不是一个不透明的
glutMainLoop
,该循环不会返回您。GLUT将事件处理代码与显示代码分离。如果你习惯了完全控制循环的模式,这会让你感觉很奇怪,但这并不难处理。基本上,您需要维护glutDisplayFunc将响应的状态,并在glutKeyboardFunc中更新该状态。所以在伪代码中(看起来你有C++下拉):

好的,这是一些非常幼稚的代码,但它应该了解如何对状态进行更改以响应用户输入,这反过来会影响渲染的内容


如前一个答案所述,如果您想要显式控制程序循环(与基于事件的范例相反),那么在GLFW和SDL中有一些不错的选项,但当然会有一些提升,因为GLUT以一种完全不同的方式进行操作。

GLUT将事件处理代码与显示代码分离。如果你习惯了完全控制循环的模式,这会让你感觉很奇怪,但这并不难处理。基本上,您需要维护glutDisplayFunc将响应的状态,并在glutKeyboardFunc中更新该状态。所以在伪代码中(看起来你有C++下拉):

好的,这是一些非常幼稚的代码,但它应该了解如何对状态进行更改以响应用户输入,这反过来会影响渲染的内容


如前一个答案所述,如果您想要显式控制程序循环(与基于事件的范例相反),那么在GLFW和SDL中有一些不错的选项,但当然会有一些提升,因为GLUT以完全不同的方式做事情。

找到了一个解决方案,所以我自己回答,供大家参考:

我迫切需要一个解决方案,而不必将现有的glut基本代码更改为GLFWSDF

在互联网上进一步挖掘,我发现freeglut支持一个函数glutMainLoopEvent(),该函数“使freeglut在其事件循环中处理一次迭代的事件。这允许应用程序控制自己的事件循环,并且仍然使用freeglut窗口系统。”

此外,freeglut支持glut的所有函数(或至少支持我的程序中使用的所有glut函数)。因此,我不必更改我的glut基代码

解决方案的伪代码如下所示。我欢迎你的评论

#include <gl/freeglut.h>
#include <filesFromProj2>
int main()
{
    glutInit(&argc, argv);
    Init();
    glutDisplayFunc(Display);
    glutKeyboardFunc(Keyboard);
    glutMouseFunc(Mouse);
    glutIdleFunc(Idle);
    // glutMainLoop();       // Do not use this

    while(ESC key not pressed)
    {
        // read data file
        // do some processing
        proj2.showresults(results)
        glutMainLoopEvent();    // One iteration only
        Display();              // Call the func used with glutDisplayFunc()
    }
    glutLeaveMainLoop();
}
#包括
#包括
int main()
{
glutInit(&argc,argv);
Init();
glutDisplayFunc(显示器);
键盘Func(键盘);
glutMouseFunc(小鼠);
glutIdleFunc(空闲);
//glutMainLoop();//不要使用此
while(未按ESC键)
{
//读取数据文件
//做一些处理
项目J2.显示结果(结果)
glutMainLoopEvent();//仅一次迭代
Display();//调用与glutDisplayFunc()一起使用的func
}
glutLeaveMainLoop();
}

我还以为多线程,也可以解决这个问题。一个线程用于glutMainLoop(),另一个线程用于数据处理

找到了一个解决方案,所以我自己回答,供大家参考:

我迫切需要一个解决方案,而不必将现有的glut基本代码更改为GLFWSDF

在互联网上进一步挖掘,我发现freeglut支持一个函数glutMainLoopEvent(),该函数“使freeglut在其事件循环中处理一次迭代的事件。这允许应用程序控制自己的事件循环,并且仍然使用freeglut窗口系统。”

此外,freeglut支持glut的所有函数(或至少支持我的程序中使用的所有glut函数)。因此,我不必更改我的glut基代码

解决方案的伪代码如下所示。我欢迎你的评论

#include <gl/freeglut.h>
#include <filesFromProj2>
int main()
{
    glutInit(&argc, argv);
    Init();
    glutDisplayFunc(Display);
    glutKeyboardFunc(Keyboard);
    glutMouseFunc(Mouse);
    glutIdleFunc(Idle);
    // glutMainLoop();       // Do not use this

    while(ESC key not pressed)
    {
        // read data file
        // do some processing
        proj2.showresults(results)
        glutMainLoopEvent();    // One iteration only
        Display();              // Call the func used with glutDisplayFunc()
    }
    glutLeaveMainLoop();
}
#包括
#包括
int main()
{
glutInit(&argc,argv);
Init();
glutDisplayFunc(显示器);
键盘Func(键盘);
glutMouseFunc(小鼠);
glutIdleFunc(空闲);
//glutMainLoop();//不要使用此
while(未按ESC键)
{
//读取数据文件
//做一些处理
项目J2.显示结果(结果)
G