1

Pythonスクリプトの出力に基づいてテキストボックスを更新するために、バックグラウンドワーカーでWindowsフォームを実行しています。リダイレクトされた出力がリアルタイムではないことを除いて、すべてうまく機能しています。かなり大幅に遅れています。

リダイレクトされた出力の応答時間を増やす方法はありますか?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;
using System.IO;

namespace JiraHeartBeat
{
    public partial class Form1 : Form
    {

        delegate void AppendTextDelegate(string text);
        BackgroundWorker Worker = new BackgroundWorker();

        public Form1()
        {
            InitializeComponent();

            Worker.DoWork += new DoWorkEventHandler(Worker_DoWork);
            Worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);

        }

        void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            StartButton.PerformClick();
        }

        private void StartButton_Click(object sender, EventArgs e)
        {
            if (!Worker.IsBusy)
            {
                Worker.RunWorkerAsync();
            }
        }

        public void Worker_DoWork(object sender, DoWorkEventArgs e)
        {
            Process pro = new Process();
            pro.StartInfo.RedirectStandardOutput = true;
            pro.StartInfo.RedirectStandardError = true;
            pro.StartInfo.UseShellExecute = false;
            pro.StartInfo.CreateNoWindow = true;
            pro.EnableRaisingEvents = true;
            pro.OutputDataReceived += new DataReceivedEventHandler(OnDataReceived);
            pro.ErrorDataReceived += new DataReceivedEventHandler(OnDataReceived);

            pro.StartInfo.FileName = "C:\\Python27\\python.exe";
            pro.StartInfo.Arguments = "\"C:\\Python27\\myscript.py\"";

            try
            {
                pro.Start();
                pro.BeginOutputReadLine();
                pro.BeginErrorReadLine();
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            Thread.Sleep(5000 * 60);
        }


        public void OnDataReceived(object sender, DataReceivedEventArgs e)
        {

            if (e.Data != null)
            {
                string temp = (e.Data) + Environment.NewLine;
                appendText(temp);

            }
        }
        public void appendText(string text)
        {
            if (ResultTextBox.InvokeRequired)
            {
                ResultTextBox.Invoke(new AppendTextDelegate(appendText), new object[] { text });
            }
            else
            {
                ResultTextBox.AppendText(text);
            }
        }
    }
}
4

2 に答える 2

1

実際の問題は、スクリプトが完了するまで Python が出力をリダイレクトしないことです。スクリプトの実行中に IronPython がリダイレクトされると思いますが (これはまだテストしていません)、残念ながら、通常の Python は出力をリダイレクトする前にスクリプトが終了するのを待つ必要があります。

于 2013-11-05T22:32:47.117 に答える
0

から以下の行を削除してみてください。イベントWorker_DoWorkの実行が遅れていると思われます。RunWorkerCompleted

Thread.Sleep(5000 * 60);

編集

上記のアプローチが試みられ、問題が完全に解決されなかったため、もう少し調査したところ、Python スクリプトからの出力をキャプチャするときに応答が遅延することが確認されました。ただし、呼び出しを追加するsys.stdout.flush()ことで、目的の動作を得ることができました。これは、テストで正常に機能した、使用した python スクリプトです。

import time
import sys

for x in xrange(0,11):
    print x
    time.sleep(1)
    sys.stdout.flush()
于 2013-10-31T03:28:15.463 に答える