【问题标题】:linux C++ xlib, does the processor go to fast?linux C++ xlib,处理器速度快吗?
【发布时间】:2013-06-11 00:15:20
【问题描述】:

这对我来说听起来很棘手,实际上我正在使用 Xlib 来绘制一些窗口。一种是用于在图像中绘制一些 2D 结果,因此仅在完成所有微积分后才绘制此结果。另一个是一个简单的窗口,上面写着“计算过程中”。

  • 所以现在在我开始微积分之前,我称之为“显示简单窗口“正在计算的微积分””,
  • 然后我调用执行计算并绘制结果的函数,
  • 然后我调用“不要向我显示简单的窗口”“正在计算”。

但问题是,我在微积分过程中没有看到“显示简单窗口“正在计算的微积分””,我只是看到它一瞬间,当显示微积分结果的图像时它就消失了。我尝试输入一些sleep() 但这并不能解决问题。什么样的东西会导致这样的问题?我在 C++ 课程中已经遇到过这样的问题,当时我在控制台上工作,我从来没有找到这个问题的原因。

谁能给我一些解释和提示,帮助我像老板一样处理它?

这里是我的代码的一部分:

switch(e.type/*xlibevent*/){
      .
      .
      .
      case KeyRelease      :
        switch(keyRelease()){ // keyRelease just recognize wich key was released
            .
            .
            .       // w3w1 = window "calculus in process"
          case 3  : w3w1.switcher(); doCalculus(&w1); w3w1.switcher(); break;
            .
            .
            .
      .
      .
      .
        }

我刚刚做了一个测试,我将doCalculus(&w1)sleep(3) 交换相同的结果,我没有看到我的窗口“正在计算”

switcher()更正

  void switcher(){
    if(this->visible==0){
      XMapWindow(dpy,this->window); // what I though before : has to map the window 
                                    // what I think now : request to map the window
      XDrawString(dpy, this->window, this->gc, 10, 14, text.c_str(), text.length());
      XFlush(dpy); // dats what missed, not sure that efficient to flush the dpy
                   // but I deal with the part of xlib I know, I will check further
                   // about that
      visible=1;
    }else{
      XUnmapWindow(dpy,this->window);
      XFlush(dpy); //...
      visible=0;
    }

【问题讨论】:

  • +1 像老板一样处理它。
  • 您是否在与 GUI 处理的其余部分相同的线程中运行计算?如果是这样,也许计算推迟了 GUI 事件循环的执行,因此在计算完成之前窗口不会更新?
  • 我想向您展示我的代码,但它很大...我在同一个线程中运行 gui 和计算,但由于它一次只做一件事,我不明白为什么在开始微积分之前,它不会等待向我展示简单的窗口

标签: c++ linux xlib


【解决方案1】:

您的主事件循环可能被您的计算阻塞了。因此,只要您忙于计算,就不会显示任何内容。如果在显示临时窗口后至少返回一次 X 事件循环,它应该会出现(尽管它可能无法正确刷新,因为它不会响应曝光事件)。最好的解决方案是在另一个线程中运行您的计算。

您对“为什么不等待显示简单窗口”的困惑是基于对 X 客户端如何工作的误解。客户端和服务器之间的交互(即使是做一些简单的事情)比你想象的要多。

【讨论】:

  • 你对我的误解是正确的。我在switcher() 中添加了XFlush(dpy),然后一切正常。
【解决方案2】:

我知道这不是 OpenGL 问题,但this OpenGL tutorial 可以为这个问题提供一些启示。基本上,您没有处理“窗口”消息以允许您创建的窗口显示。检查 wiki 中的 while(1) 循环。

你有两个选择:

  1. 分步运行您的计算。每个步骤都由 while 循环中的每个调用处理
  2. 在单独的线程中运行您的计算,从while(1) 循环中查询每一帧的进度并显示它。

就个人而言,我更喜欢 2。

【讨论】:

  • 我的 while 与教程中的类似,只是为了方便我使用 switch 而不是 if/else。我猜你对使用单独的线程是正确的。但我真正想了解的是,如果我只有一个线程,是否应该在启动 doCalculus(&w1) / sleep(3) 之前完成 w3w1.switcher() ?对我来说,编译器似乎已经合并了w3w1.switcher(); doCalculus(&w1); w3w1.switcher(); break;,并在完成doCalculus(&w1) / sleep(3) 之前自行决定不执行第一个w3w1.switcher()。我想理解,因为如果我认为错了,那就不好了..跨度>
  • 查看我的switcher() 方法的答案。谢谢你的评论
猜你喜欢
  • 2012-09-21
  • 1970-01-01
  • 2020-01-27
  • 2018-03-04
  • 2019-06-29
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多