首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++上的gnuplot和usleep

C++上的gnuplot和usleep
EN

Stack Overflow用户
提问于 2012-02-23 05:38:37
回答 1查看 973关注 0票数 2

我正在尝试在Linux上进行实时绘图。一切运行正常,只是当程序结束时,有一段时间会有大量的CPU使用。此外,因为我在usleep上使用的时间很短(比如0.3秒),所以我不知道为什么bash shell被gnuplot界面所主导,即使对于我试图打开的其他bash窗口,我也不能使用ctrl+c来停止程序。

有没有其他功能可以代替我们的睡眠?或者一些我可以纠正的东西,以避免gnuplot在窗口上的主导地位?

提前感谢并为我糟糕的英语道歉

我把代码放在这里

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
float s=10.;
float r=28.;
float b=8.0/3.0;
/* Definimos las funciones */
float f(float x,float y,float z){
    return s*(y-x);
}
float g(float x,float y,float z){
    return x*(r-z)-y;
}
float h(float x,float y,float z){
    return x*y-b*z;
}
FILE *output;
FILE *gp;

int main(){
    gp = popen("gnuplot -","w");
    output = fopen("lorenzgplot.dat","w");
    float t=0.; 
    float dt=0.01;
    float tf=30;
    float x=3.;
    float y=2.;
    float z=0.;
    float k1x,k1y,k1z, k2x,k2y,k2z,k3x,k3y,k3z,k4x,k4y,k4z;
    fprintf(output,"%f %f %f \n",x,y,z);
    fprintf(gp, "splot '/home/david/documents/lorenzgplot.dat' with lines \n");
/* Ahora Runge Kutta de orden 4 */  
    while(t<tf){
        /* RK4 paso 1 */
        k1x = f(x,y,z)*dt;
        k1y = g(x,y,z)*dt;
        k1z = h(x,y,z)*dt;
        /* RK4 paso 2 */
        k2x = f(x+0.5*k1x,y+0.5*k1y,z+0.5*k1z)*dt;
        k2y = g(x+0.5*k1x,y+0.5*k1y,z+0.5*k1z)*dt;
        k2z = h(x+0.5*k1x,y+0.5*k1y,z+0.5*k1z)*dt;
        /* RK4 paso 3 */
        k3x = f(x+0.5*k2x,y+0.5*k2y,z+0.5*k2z)*dt;
        k3y = g(x+0.5*k2x,y+0.5*k2y,z+0.5*k2z)*dt;
        k3z = h(x+0.5*k2x,y+0.5*k2y,z+0.5*k2z)*dt;
        /* RK4 paso 4 */
        k4x = f(x+k3x,y+k3y,z+k3z)*dt;
        k4y = g(x+k3x,y+k3y,z+k3z)*dt;
        k4z = h(x+k3x,y+k3y,z+k3z)*dt;
        /* Actualizamos las variables y el tiempo */
        x += (k1x/6.0 + k2x/3.0 + k3x/3.0 + k4x/6.0);
        y += (k1y/6.0 + k2y/3.0 + k3y/3.0 + k4y/6.0);
        z += (k1z/6.0 + k2z/3.0 + k3z/3.0 + k4z/6.0);
        /* finalmente escribimos sobre el archivo */

        fprintf(output,"%f %f %f \n",x,y,z);
        fflush(output); 
        usleep(100000);
        fprintf(gp, "replot \n");
        fflush(gp);
        t += dt;
    }
    fclose(gp);
    fclose(output);
    return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-23 10:33:18

考虑一下:

代码语言:javascript
复制
gp = popen("nice gnuplot -","w");

将在某种程度上阻止gnuplot吞噬您的系统,但是您是否想过在启动gnuplot之前运行您的runge-kutta代码?将输出写入一个文件,然后在后台作业中将该文件提供给gnuplot。

例如,这一切都放在一个脚本中,如果你愿意的话,你可以很好地和/或使用at。

代码语言:javascript
复制
runge-kutta > rkfile.dat
cat rkfile.dat | gnuplot - &
wait

在示例中:

代码语言:javascript
复制
at -k now <<!
 cd /path/to/rk
 nice ./my_rkscript.sh
!

所有这些都是防止工作吞噬你当前交互环境的一些方法。可以说,这样一来,“窗口”就不会被绑起来。示例脚本需要stderr的重定向,如果需要,还需要添加一些其他改进。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9403474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档