【发布时间】: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 和计算,但由于它一次只做一件事,我不明白为什么在开始微积分之前,它不会等待向我展示简单的窗口