2012-04-14 2 views
1

В настоящее время я работаю над проектом, в котором приложение andoid, которое я написал элементы управления и объекты в своем окне OpenGL на ПК. Я получил окно OpenGL, чтобы делать то, что хочу, и я получил данные с моего устройства Android для потоковой передачи на терминал. Однако мне нужны данные, передаваемые на терминал, который будет использоваться объектом OpenGL. Когда я пытаюсь запустить их в том же скрипте, он просто застревает в «glutMainLoop» и никогда не достигает точки, где установлено соединение с моим устройством. Я знаю, что это проблема comman с 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? 

ответ

2

Вы можете прекратить использование GLUT. GLFW дает вам лучший контроль над циклом, так что легче выполнять другую обработку.

Если вы настаиваете на использовании GLUT и используете FreeGLUT, вы можете использовать glutMainLoopEvent. Эта функция обрабатывает одну итерацию основного цикла. Поэтому вы можете просто вставить его в бесконечный цикл и называть его неоднократно. Как часть этого цикла, вы можете делать другие вещи, такие как извлечение данных с терминала или что-то еще.

+0

Благодарим за ответ! К несчастью с машинами приложение будет использоваться по моему единственному варианту - GLUT. Я попробую ваше решение и вернусь к вам. Еще раз спасибо! – user1194366

+0

@ user1194366: В GLUT нет платформы, на которой FreeGLUT и GLFW не работают. Все, что вам нужно сделать, это отправить соответствующую DLL с вашим .exe или просто статически связать с ними. –

+0

Да, я понимаю это, но приложение будет запускаться на панели управления, где команды Glut захватываются Chromium и отображаются на многих мониторах высокого разрешения. Хром будет работать только со стандартной библиотекой. – user1194366

0

freeglut предлагает glutMainLoopEvent, поэтому вы можете выбрать свой рабочий режим.

+0

спасибо за совет, но это не сработало для меня. Я пошел с glutIdleFuc. Прекрасно работает – user1194366

Смежные вопросы