jjzjj

c++ - 控制台菜单更新 OpenGL 窗口

coder 2024-02-22 原文

我正在制作一个应用程序来进行一些自定义图像处理。该程序将由控制台中的一个简单菜单驱动。用户将输入图像的文件名,该图像将使用 openGL 在窗口中显示。当用户选择要对图像进行某些处理时,处理完成,openGL 窗口应该重新绘制图像。

我的问题是我的图像从来没有绘制到窗口,而是窗口始终是黑色的。我认为这可能与我在程序中组织线程的方式有关。主执行线程处理菜单输入/输出和图像处理并调用 Display 方法,而第二个线程运行 openGL 主循环。

这是我的主要代码:

#include <iostream>
#include <GL/glut.h>
#include "ImageProcessor.h"
#include "BitmapImage.h"

using namespace std;

DWORD WINAPI openglThread( LPVOID param );
void InitGL();
void Reshape( GLint newWidth, GLint newHeight );
void Display( void );

BitmapImage* b;
ImageProcessor ip;


int main( int argc, char *argv[] ) {
    DWORD threadID;
    b = new BitmapImage();

    CreateThread( 0, 0, openglThread, NULL, 0, &threadID );

    while( true ) {
        char choice;
        string path = "TestImages\\";
        string filename;
        cout << "Enter filename: ";
        cin >> filename;
        path += filename;
        b = new BitmapImage( path );
        Display();

        cout << "1) Invert" << endl;
        cout << "2) Line Thin" << endl;
        cout << "Enter choice: ";
        cin >> choice;

        if( choice == '1' ) {
            ip.InvertColour( *b );
        }
        else {
            ip.LineThinning( *b );
        }
        Display();
    }

    return 0;
}


void InitGL() {
    int argc = 1;
    char* argv[1];
    argv[0] = new char[20];
    strcpy( argv[0], "main" );

    glutInit( &argc, argv );

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowPosition( 0, 0 );
    glutInitWindowSize( 800, 600 );
    glutCreateWindow( "ICIP Program - Character recognition using line thinning, Hilbert curve, and wavelet approximation" );

    glutDisplayFunc( Display );
    glutReshapeFunc( Reshape );

    glClearColor(0.0,0.0,0.0,1.0);

    glEnable(GL_DEPTH_TEST);
}


void Reshape( GLint newWidth, GLint newHeight ) {
    /*  Reset viewport and projection parameters  */
    glViewport( 0, 0, newWidth, newHeight );
}


void Display( void ) {
    glClear (GL_COLOR_BUFFER_BIT); // Clear display window.
    b->Draw();
    glutSwapBuffers();
}


DWORD WINAPI openglThread( LPVOID param ) {
    InitGL();
    glutMainLoop();
    return 0;
}

这是我的 BitmapImage 绘制方法:

void BitmapImage::Draw() {
    cout << "Drawing" << endl;
    if( _loaded ) {
        glBegin( GL_POINTS );
            for( unsigned int i = 0; i < _height * _width; i++ ) {
                glColor3f( _bitmap_image[i*3] / 255.0, _bitmap_image[i*3+1] / 255.0, _bitmap_image[i*3+2] / 255.0 );
                // invert the y-axis while drawing
                glVertex2i( i % _width, _height - (i / _width) );
            }
        glEnd();
    }
}

关于这个问题有什么想法吗?

编辑:通过从每 500 毫秒调用 glutPostRedisplay() 的 openglThread 启动一个 glutTimer,从技术上解决了这个问题。现在这没问题,但我更喜欢一种解决方案,在这种解决方案中,每次更改位图(以节省处理时间)时我只需要重新显示,而无需运行另一个线程(计时器是我假设的另一个线程)。这主要是因为主处理线程将执行大量密集工作,我想将大部分资源专用于此线程而不是其他任何事情。

最佳答案

我以前遇到过这个问题 - 这很烦人。问题是所有 OpenGL 调用都必须在启动 OpenGL 上下文的线程中完成。因此,当您希望主(输入)线程更改 OpenGL 线程中的某些内容时,您需要以某种方式向线程发出信号,表明它需要做一些事情(设置标志或其他内容)。

注意:我不知道你的BitmapImage 加载函数(这里是你的构造函数)做了什么,但它可能有一些 OpenGL 调用。以上也适用于此!因此,您需要向另一个线程发出信号,让其为您创建一个 BitmapImage,或者至少执行创建位图的 OpenGL 相关部分。

关于c++ - 控制台菜单更新 OpenGL 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/525227/

有关c++ - 控制台菜单更新 OpenGL 窗口的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  4. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  5. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  6. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  7. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  8. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  9. objective-c - 在设置 Cocoa Pods 和安装 Ruby 更新时出错 - 2

    我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U

  10. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

随机推荐