C++11 使用 OpenGL 进行多线程渲染可防止主线程读取 stdin

2024-01-04

它似乎与平台相关(适用于我的笔记本电脑上的 Ubuntu 12.04,不适用于我的工作站上的另一个 Ubuntu 12.04)。

这是关于我使用两个线程所做的事情的示例代码。

#include <iostream>
#include <thread>
#include <chrono>
#include <atomic>
#include <GL/glfw.h>

using namespace std;

int main() {
  atomic_bool g_run(true);
  string s;
  thread t([&]() {
    cout << "init" << endl;

    if (!glfwInit()) {
      cerr << "Failed to initialize GLFW." << endl;
      abort();
    }

    glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 2);
    glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 1);

    if(!glfwOpenWindow(640, 480, 8, 8, 8, 0, 24, 0, GLFW_WINDOW)) {
      glfwTerminate();
      cerr << "Cannot open OpenGL 2.1 render context." << endl;
      abort();
    }

    cout << "inited" << endl;

    while (g_run) {
      // rendering something
      cout << "render" << endl;
      this_thread::sleep_for(chrono::seconds(1));
    }
    // unload glfw
    glfwTerminate();
    cout << "quit" << endl;
  });
  __sync_synchronize(); // a barrier added as ildjarn suggested.
  while (g_run) {
    cin >> s;
    cout << "user input: " << s << endl;
    if (s == "q") {
      g_run = false;
      cout << "user interrupt" << endl;
      cout.flush();
    }
  }
  __sync_synchronize(); // another barrier
  t.join();
}

这是我的编译参数:

g++ -std=c++0x -o main main.cc -lpthread -lglfw

我的笔记本电脑运行这个程序,如下所示:

init
inited
render
render
q
user input: q
user interrupt
quit

工作站只输出:

init
inited
render
render
q
render
q
render
q
render
^C

它只是简单地忽略了我的输入(另一个程序与 glew 和 glfw 的过程相同,只是跳出主线程中的 while 循环,而不读取我的输入。)BUT这个东西用gdb可以正常工作!

知道发生了什么事吗?

Update

在其他机器上进行更多测试后,NVIDIA的驱动程序导致了这一点。在其他配备 NVIDIA 显卡的机器上也会发生同样的情况。


我使用此代码关闭我的程序并在运行时获取我的 q 键

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <termios.h>


static struct termios old, _new;
static void * breakonret(void *instance);

/* Initialize _new terminal i/o settings */
void initTermios(int echo)
{
 tcgetattr(0, &old); /* grab old terminal i/o settings */
 _new = old; /* make _new settings same as old settings */
 _new.c_lflag &= ~ICANON; /* disable buffered i/o */
 _new.c_lflag &= echo ? ECHO : ~ECHO; /* set echo mode */
 tcsetattr(0, TCSANOW, &_new); /* use these _new terminal i/o settings now */
}

/* Read 1 character with echo */
char getche(void)
{
 char ch;
 initTermios(1);
 ch = getchar();
 tcsetattr(0, TCSANOW, &old);
 return ch;
}

int main(){
 pthread_t mthread;
 pthread_create(&mthread, NULL, breakonret, NULL); //initialize break on return 
 while(1){
   printf("Data on screen\n");
   sleep(1);
 }
pthread_join(mthread, NULL);
}
static void * breakonret(void *instance){// you need to press q and return to close it
 char c;
 c = getche();
 printf("\nyou pressed %c \n", c);
 if(c=='q')exit(0);
 fflush(stdout);
}

这样你就有一个线程从键盘读取数据

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11 使用 OpenGL 进行多线程渲染可防止主线程读取 stdin 的相关文章

随机推荐

  • 如何高效生成Zipf分布数?

    我目前正在对 C 中的一些数据结构进行基准测试 我想在处理 Zipf 分布式数字时测试它们 我正在使用此网站上提供的生成器 http www cse usf edu christen tools toolpage html http www
  • 在c中交换两个结构

    您好 我正在尝试创建一个交换函数来交换结构的前两个元素 有人可以告诉我如何进行这项工作吗 void swap struct StudentRecord A struct StudentRecord B struct StudentRecor
  • 在 VSCode 中关闭提交消息文件时,Git 挂起并显示“提示:正在等待编辑器关闭文件...”

    我在跑git commit amend在 VSCode 终端中 它会在 VSCode 编辑器窗口中以文件形式弹出提交消息 并且 git 会说 在终端中 hint Waiting for your editor to close the fi
  • 有没有办法自定义ViewPager滚动的阈值?

    我无法找到更改 ViewPager 中滚动页面的触摸阈值的方法 http developer android com reference android support v4 view ViewPager html http develop
  • 获取上次重新启动时间[重复]

    这个问题在这里已经有答案了 可能的重复 显示构建日期 https stackoverflow com questions 1600962 displaying the build date 如何知道 Windows 何时启动或关闭 http
  • 声明全局静态变量

    我正在尝试在 Visual Studio 中设置全局变量 但无法将其设为静态 有什么方法可以让我将变量设置为静态并在不同的方法之间共享它 或者有什么方法可以在每次更改时保存变量 您有两个选择 1 创建一个包含共享变量的类 这与 C 中的静态
  • 摆脱新 Android 上的旧应用程序图标

    前段时间我做了一个简单的 Android 应用程序 一个上传数据的共享意图处理程序 现在我为它设计了一个新的 SVG 图标 以矢量图形导入到项目中 然后使用 InkScape 转换为一系列 PNG 并替换项目中的所有 PNG 该应用程序现在
  • 使用 SparkSession 或 sqlcontext 时出错

    我是火花新手 我只是想使用sparksession 或sqlcontext 解析json 文件 但每当我运行它们时 我都会收到以下错误 Exception in thread main java lang NoSuchMethodError
  • 无法在 /usr/bin 内部创建符号链接,即使使用 sudo [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我尝试对 usr bin 文件夹中的二进制文件进行符号链接时 出现 操作不允许 错误 sudo ln s usr bin python2
  • 在两个进程之间交换大量数据的最有效方法是什么?

    最近我正在为一个软件构建DVR http en wikipedia org wiki Digital video recorder 它将安装在插入了 2 个或更多 PCIE x4 视频编码器卡的 x86 PC 服务器上 我们有两个独立的进程
  • 单击标签时阻止 select2 打开

    这个问题演变成了阻止按下回车键时打开下拉菜单 正如你所看到的 我丑陋的解决方案用一个关闭下拉菜单setTimeout当标签输入具有焦点时按 Enter 键 如何防止它在输入时完全打开 而不是在打开后关闭它 以下是一些可能有用的事件 http
  • 顶部“xterm”:未知终端类型

    运行 TOP 命令时出现错误 gt top xterm unknown terminal type gt echo TERM xterm gt echo DISPLAY DYSPLAY Undefined variable gt cat e
  • 当 HTML5 搜索输入可见时,嵌入的 YouTube 视频无法在 iPad (iOS 7) 上播放

    这是一个错误 我已经设法通过暴力修复 但我不明白为什么该解决方案有效 问题在于 嵌入式 YouTube 视频无法在 iPad 在 iOS7 中测试 的横向视图中的特定 响应式 网站上运行 我设法将其范围缩小到一个特定的 CSS 规则 当浏览
  • C# 8.0 默认接口实现基本语法/显式调用

    我一直在搞乱默认的接口实现 认为您必须向下转换为接口类型才能使用默认方法实现 我还发现了一堆关于另一种语法的注释 我找不到这是否已经包含在内 我确实找到了关于它的外观的 决定 但是它不起作用 我做错了吗 还是这个新语法尚未包含在内 有些相关
  • 如何将 matplotlib 图导出为具有可编辑文本字段的矢量图形?

    我正在尝试导出多个绘图以在 Adob e Illustrator 中进行编辑 并且尝试将标题 轴标签和条形图标签作为单独的文本字段 即 如果我单击 Illustrator 或您选择的编辑器 中的标题 整个标题就是一个单独的字段 以下是我如何
  • C# - 无法处理 Enter 和 Tab 键事件

    我是新的 c 我正在使用下面的代码 但该代码不适用于 Enter 键和 Tab 键 请解决这个问题 private void Panel Load object sender EventArgs e this KeyDown new Key
  • 对于给定的二叉树找到最大二叉搜索子树

    对于给定的二叉树 找到最大的子树也是二叉搜索树 Example Input 10 50 150 25 75 200 20 15 35 65 30 120 135 155 250 Output 50 25 75
  • Powershell 文本搜索 - 多个匹配项

    我有一组 txt 文件 其中包含以下一个或两个字符串 red blue green orange purple 列表中还有更多 50 多种 可能性 如果有帮助 我可以判断 txt 文件是否包含一项或两项 但不知道它们是哪一项 字符串模式始终
  • catch(...) 中的 throw 是按值还是按引用抛出

    我的老板回答了这个问题为什么catch块中存在 三点 https stackoverflow com questions 36737602 why three points in catch block is exist 36738071
  • C++11 使用 OpenGL 进行多线程渲染可防止主线程读取 stdin

    它似乎与平台相关 适用于我的笔记本电脑上的 Ubuntu 12 04 不适用于我的工作站上的另一个 Ubuntu 12 04 这是关于我使用两个线程所做的事情的示例代码 include