0

Wiresharkファイルをキャプチャして再生し、すべてのパケットをネットワークカードに送信するアプリケーションを構築します。アプリケーションでは、ユーザーはフォルダーを選択でき、このフォルダー内のすべてのファイルがリストボックスに追加され、無限ループで再生されます。私のアプリケーションではPcapdotnetDLLを使用していますが、500ファイル後にライブラリがファイルにアクセスしようとしてアプリケーションがクラッシュするというWincapのバグのため、インターフェイス番号とファイルパスを引数として取るexeファイルを作成しました。ファイルの再生が終了すると、exeファイルが閉じます。この場合、クラッシュすることなく500を超えるファイルを再生できます。

これは、リストボックスからすべてのファイルの再生を開始するスタートボタンです 。sendQueueは、ファイルパスを送信するexeファイルです。

private void btnStart_Click(object sender, EventArgs e)
{
    shouldContinue = true;

    this.Invoke((MethodInvoker)delegate
    {
        btnStart.Enabled = false;
        btnStop.Enabled = true;
        groupBoxAdapter.Enabled = false;
        groupBoxRootDirectory.Enabled = false;
    });

    backGroundWorker = new BackgroundWorker();
    backGroundWorker.WorkerReportsProgress = true;
    backGroundWorker.DoWork += new DoWorkEventHandler(
    (s3, e3) =>
    {

        for (int i = 0; i < lbFiles.Items.Count && shouldContinue; i++)
        {
            this.Invoke((MethodInvoker)delegate
            {
                lbFiles.SetSelected(i, true);
                toolStripStatusLabel.Text = string.Format("Playing file no {0} of {1}", i + 1, lbFiles.Items.Count);
            });

            sendQueue((string)lbFiles.Items[i]); 
        }
    });

    backGroundWorker.RunWorkerAsync();
}

私がやりたいのは、shouldContinueブール変数をfalseに変更して再生を停止し、ファイル(SendQueue.exe)を再生しているすべてのプロセスを閉じるための停止ボタンです。問題は、プロセスがまだ実行されていることです。

bool shouldContinue = true;

private void btnStop_Click(object sender, EventArgs e)
{
    shouldContinue = false;

    foreach (Process prc in System.Diagnostics.Process.GetProcessesByName("SendQueue"))
    {
        prc.Kill();
        prc.WaitForExit();
    }

    toolStripStatusLabel.Text = "Stop playing";
}
4

0 に答える 0