【问题标题】:gnuplot and usleep on Cgnuplot 和 c 上的睡眠
【发布时间】:2012-02-22 21:38:36
【问题描述】:

我正在尝试在 Linux 上进行实时绘图。一切运行正常,只是程序结束的时候,有一段时间CPU占用很大。此外,因为我在睡眠中使用了很短的时间(比如 0.3 秒),所以我不知道为什么 bash shell 由 gnuplot 接口控制,即使对于我尝试打开的其他 bash 窗口,我也不能使用 ctrl+c 来停止程序。

我可以使用任何其他功能来代替 usleep 吗?或者我可以纠正什么以避免 gnuplot 在 windows 上的优势?

在此先感谢,并为我的英语不好感到抱歉

我把代码放在这里

#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;
}

【问题讨论】:

    标签: c plot real-time gnuplot usleep


    【解决方案1】:

    考虑:

    gp = popen("nice gnuplot -","w");
    

    会在一定程度上阻止 gnuplot 吃掉你的系统,但是你有没有想过在启动 gnuplot 之前运行你的 runge-kutta 代码?将输出写入文件,然后在后台作业中将文件提供给 gnuplot。

    例如,这一切都在一个脚本中,您可以根据需要使用和/或使用 at。

    runge-kutta > rkfile.dat
    cat rkfile.dat | gnuplot - &
    wait
    

    例如:

    at -k now <<!
     cd /path/to/rk
     nice ./my_rkscript.sh
    !
    

    所有这些都是防止工作吃掉当前交互环境的一些方法。 这样一来,“窗口”就不会被束缚,可以这么说。示例脚本需要重定向 stderr 以及您根据需要添加的其他一些改进。

    【讨论】:

    • 哦,谢谢。程序完成后不再消耗 CPU。是的,最好先运行 RKutta,我只是在测试实时绘图的工作原理。当代码中的循环需要更多时间来计算一个值时,它可能会更有用。关于最后一个例子,我不太了解这些命令,但我会看看它们,我明白了:)
    猜你喜欢
    • 1970-01-01
    • 2012-12-16
    • 2016-08-17
    • 2021-05-11
    • 2023-04-05
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    相关资源
    最近更新 更多