围绕 glutMainLoop 执行我的程序的其余部分?
Posted
技术标签:
【中文标题】围绕 glutMainLoop 执行我的程序的其余部分?【英文标题】:Excuting the rest of my programme around glutMainLoop? 【发布时间】:2012-04-14 14:07:43 【问题描述】:我目前正在开发一个项目,其中我在 PC 上的 OpenGL 窗口中编写了控件和对象的 android 应用程序。我已经得到了 OpenGL 窗口来做我想做的事,并且我已经从我的 android 设备获取数据以流式传输到终端。但是,我需要将数据流式传输到终端以供 OpenGL 对象使用。当我尝试在同一个脚本中运行它们时,它只会卡在“glutMainLoop”中,并且永远不会达到与我的设备建立连接的地步。我知道这是 glutMainLoop 的一个常见问题。我正在寻找任何建议。我是不是走错了路?有更好的方法吗?我在下面附上了我的代码:
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <strings.h>
#include <vrpn_Shared.h>
#include <vrpn_Analog.h>
#include <vector>
#include <imageviewer.h>
using namespace std;
int done = 0; // Signals that the program should exit
unsigned tracker_stride = 1; // Every nth report will be printed
//-------------------------------------
// This section contains the data structure that holds information on
// the devices that are created. For each named device, a remote of each
// type analog is created.
class device_info
public:
char *name;
vrpn_Analog_Remote *ana;
;
const unsigned MAX_DEVICES = 2;
//-------------------------------------
// This section contains the data structure that is used to determine how
// often to print a report for each sensor of each tracker. Each element
// contains a counter that is used by the callback routine to keep track
// of how many it has skipped. There is an element for each possible sensor.
// A new array of elements is created for each new tracker object, and a
// pointer to it is passed as the userdata pointer to the callback handlers.
class t_user_callback
public:
char t_name[vrpn_MAX_TEXT_LEN];
vector<unsigned> t_counts ;
;
//Callback handlers
void VRPN_CALLBACK handle_analog (void *userdata, const vrpn_ANALOGCB a)
int i;
const char *name = (const char *)userdata;
printf("Input from %s:\n \n %5.0f", name, a.channel[0]);
for (i = 1; i < a.num_channel; i++)
printf(" %5.0f \n", a.channel[1]);
printf(" \n");
int main (int argc, char * argv [])
int print_for_tracker = 1; // Print tracker reports?
int print_for_button = 1; // Print button reports?
int print_for_analog = 1; // Print analog reports?
int print_for_dial = 1; // Print dial reports?
int print_for_text = 1; // Print warning/error messages?
device_info device_list[MAX_DEVICES];
unsigned num_devices = 0;
int i;
// Parse arguments, creating objects as we go. Arguments that
// change the way a device is treated affect all devices that
// follow on the command line.
for (i = 1; i < argc; i++)
if (!strcmp(argv[i], "-notracker"))
print_for_tracker = 0;
else if (!strcmp(argv[i], "-nobutton"))
print_for_button = 0;
else if (!strcmp(argv[i], "-noanalog"))
print_for_analog = 0;
else if (!strcmp(argv[i], "-nodial"))
print_for_dial = 0;
else if (!strcmp(argv[i], "-notext"))
print_for_text = 0;
else if (!strcmp(argv[i], "-trackerstride"))
if (tracker_stride <= 0)
fprintf(stderr, "-trackerstride argument must be 1 or greater\n");
return -1;
else // Create a device and connect to it.
device_info *dev;
// Make sure we have enough room for the new device
if (num_devices == MAX_DEVICES)
fprintf(stderr,"Too many devices!\n");
exit(-1);
// Name the device and open it as everything
dev = &device_list[num_devices];
dev->name = argv[i];
dev->ana = new vrpn_Analog_Remote(dev->name);
if ( (dev->ana == NULL) )
fprintf(stderr,"Error opening %s\n", dev->name);
return -1;
else
printf("Opened %s as:", dev->name);
if (print_for_analog)
printf(" Analog");
dev->ana->register_change_handler(dev->name, handle_analog);
printf(".\n");
num_devices++;
// main interactive loop
printf("Press ^C to exit.\n");
while ( ! done )
unsigned i;
// Let all the devices do their things
for (i = 0; i < num_devices; i++)
device_list[i].ana->mainloop();
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowSize(400,300);
glutInitWindowPosition(200,100);
glutCreateWindow("ImageViewer");
init();
glutDisplayFunc(display);
glutMotionFunc(drag);
glutMouseFunc(mouse);
glutMainLoop();
return 0;
// a.channel[0] = x
// a.channel[1] = y
// a.channel[2] = Zoom?
【问题讨论】:
【参考方案1】:您可以停止使用 GLUT。 GLFW 让您可以更好地控制循环,从而更轻松地进行其他处理。
如果您坚持使用 GLUT,并且您正在使用 FreeGLUT,那么您可以使用glutMainLoopEvent
。此函数处理主循环的一次迭代。所以你可以把它粘在一个无限循环中并重复调用它。作为该循环的一部分,您可以执行其他操作,例如从终端提取数据等。
【讨论】:
感谢您的回复!不幸的是,我唯一的选择是 GLUT。我会尝试您的解决方案并回复您。再次感谢! @user1194366:GLUT 不支持 FreeGLUT 和 GLFW 无法运行的平台。您所要做的就是将适当的 DLL 与您的 .exe 一起提供,或者只是静态链接到它们。 是的,我明白这一点,但该应用程序将在 Powerwall 上运行,其中 Glut 命令由 Chromium 捕获并在许多高分辨率显示器上呈现。 Chromium 仅适用于标准库。 @user1194366:GLUT 不再是 FreeGLUT 或 GLFW 的标准库。它不是 OpenGL 的一部分,也不是任何标准化机构的“标准”。此外,如果这是您正在运行的系统,那么您需要在您的问题中说。 轻松解决我的问题。有一个 glutIdleFuc 可以暂停主循环并执行另一段代码。【参考方案2】:freeglut 提供glutMainLoopEvent,所以你可以选择你的运行模式。
【讨论】:
感谢您的建议,但这对我不起作用。我已经选择了 glutIdleFuc。完美运行以上是关于围绕 glutMainLoop 执行我的程序的其余部分?的主要内容,如果未能解决你的问题,请参考以下文章
OpenGL Ubuntu 13.10 QtCreator - 未定义对“glutMainLoop”的引用
如何在 glfw 中 glutDisplayFunc、glutMainLoop?