-1

Pcapファイル(wiresharkファイル)を取得してパケットを再生するアプリケーションを構築します。再生操作は、ファイルパスとインターフェイスintを取得するexeファイルを使用します。

private void btnStart_Click(object sender, EventArgs e)
{
    shouldContinue = true;
    btnStart.Enabled = false;
    btnStop.Enabled = true;
    groupBoxAdapter.Enabled = false;
    groupBoxRootDirectory.Enabled = false;
    string filePath = string.Empty;

    ThreadPool.QueueUserWorkItem(delegate
    {
        for (int i = 0; i < lvFiles.Items.Count && shouldContinue; i++)
        {
            this.Invoke((MethodInvoker)delegate { filePath = lvFiles.Items[i].Tag.ToString(); });
            pcapFile = new PcapFile();
            pcapFile.sendQueue(filePath, adapter);
        }

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

sendQueueコード:

public void sendQueue(string filePath, int deviceNumber)
        {
            ProcessStartInfo processStartInfo = new ProcessStartInfo(@"D:\Downloads\SendQueue\sendQueue.exe");
            processStartInfo.Arguments = string.Format("{0} {2}{1}{2}", (deviceNumber).ToString(), filePath, "\"");
            processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            processStartInfo.RedirectStandardOutput = true;
            processStartInfo.RedirectStandardError = true;
            processStartInfo.CreateNoWindow = true;
            processStartInfo.UseShellExecute = false;
            processStartInfo.ErrorDialog = false;

            using (Process process = Process.Start(processStartInfo))
            {
                process.WaitForExit();
            }
        }
4

2 に答える 2

1

バックグラウンドワーカーが必要だとは思わないでください。

     List<string> tags = new List<string>();
     foreach (object item in lvFiles.Items)
     {
        tags.Add(item.tag.ToString());
     }

     ThreadPool.QueueUserWorkItem(delegate
     {
       for (int i = 0; i < tags.Count && shouldContinue; i++)
       {
           sendQueue(tags[i], adapter);
       }

        //...
     }
于 2013-01-01T19:30:36.140 に答える
1

pcapFile.sendQueueが同期しているため、UIスレッドがブロックされている可能性があります。これは、非同期ループが再生ファイルをキューに入れている場合でも、UIスレッドがファイルのコンテンツの再生時間の99.99%でビジーであることを意味します。PcapFileのソースを投稿していないため、これが当てはまる場合と当てはまらない場合があります。

UIをレスポンシブにするタスクはもう少し複雑です。一度にフレーム(オーディオ?ビデオ?)をロードし、残りの時間はUIスレッドを実行するか、完全に機能するようにPcapFileを再構築する必要があります。バックグラウンド。

フォームデザインは、BackgroundWorkerで実行するのではなく、PcapFileからのイベントにも依存する必要があります。

于 2013-01-01T19:31:00.550 に答える