1

C# アプリケーションから GnuPlot を使用しています。ファイルに保存してから読み取るのではなく、GnuPlot PNG 出力を標準出力から直接読み取りたいと思います。私のコードは今次のようになります:

string Path = @"C:\Program Files\gnuplot\bin\gnuplot.exe";
Process GnuplotProcess = new Process();
GnuplotProcess.StartInfo.FileName = Path;
GnuplotProcess.StartInfo.UseShellExecute = false;
GnuplotProcess.StartInfo.RedirectStandardInput = true;
GnuplotProcess.StartInfo.RedirectStandardOutput = true;
GnuplotProcess.Start();
StreamWriter SW = GnuplotProcess.StandardInput;
StreamReader SR = GnuplotProcess.StandardOutput;
SW.WriteLine("set terminal pngcairo size 300,200");
foreach (LoadCaseOutput LCO in LoadCases)
{
    foreach (LoadCaseOutput.MemberOutput MO in LCO.Members)
    {
        SW.WriteLine("plot " + MO.GenerateAFEquation(P));
        MO.AFImage = Image.FromStream(SR.BaseStream);
    }
}
SW.WriteLine("exit");
GnuplotProcess.Close();

現在、これは Image.FromStream() 行で停止しているようです。何がうまくいかないのですか?

4

2 に答える 2

1

更新(以下のコメントを反映するようにコードを更新しました)

「exit」コマンドが gnuPlot に送信されたときに問題が発生したようです。gnuPlot に終了コマンドが送信されない場合、プログラムは待機します。

私はあなたの例を取り上げ、実行ツリーで gnuPlot 終了コマンドを上に移動することで、プログラムを完了することができました。

        string Path = @"z:\tools\gnuplot\bin\gnuplot.exe";
        Process GnuplotProcess = new Process();
        GnuplotProcess.StartInfo.FileName = Path;
        GnuplotProcess.StartInfo.UseShellExecute = false;
        GnuplotProcess.StartInfo.RedirectStandardInput = true;
        GnuplotProcess.StartInfo.RedirectStandardOutput = true;
        GnuplotProcess.Start();
        StreamWriter SW = GnuplotProcess.StandardInput;
        StreamReader SR = GnuplotProcess.StandardOutput;
        SW.WriteLine("set terminal pngcairo size 300,200");
        SW.WriteLine("plot f(x) = sin(x*a), a = .2, f(x), a = .4, f(x)");
        SW.WriteLine("exit");

        Image png = Image.FromStream(SR.BaseStream);
        png.Save(@"z:\tools\try3a.png");

        GnuplotProcess.Close();

これにより、PNG ファイルが正しく生成されました。テストのために、終了コマンドを送信する前にストリームからの読み取りを試みました。プログラムは FromStream 呼び出しを待機します。

マット

于 2013-03-29T19:59:12.587 に答える
0

問題は読み取りではありません。そうしないと、例外が発生します。読み取りビットを次のように置き換えます。

Image.FromStream(oFileStream, false, true)

最初のバイトを受信するとすぐにイメージを検証し、そこから移動します。

于 2013-03-29T19:40:28.017 に答える