1

このコードは、バックグラウンド ワーカーを使用して並列にスレッドを使用してソケットから画像を読み取っています。新しいイメージに同じソケットを再利用したいのですが、次のエラーが発生します。

*エラー : 別のプロセスで使用されているため、プロセスはファイル "D:\image 1.png にアクセスできません *

つまり、私の考えは、前のプロセスを強制終了し、同じソケットで新しいプロセスを開始することです。

enter code here

名前空間 ScreenCapture { public partial class Form1 : Form { String ipaddress; public Form1() { InitializeComponent(); backgroundWorker1.WorkerReportsProgress = true; }

    private void button1_Click(object sender, EventArgs e)
    {

        ipaddress=textBox1.Text;
        try
        {
            TcpClient client = new TcpClient(ipaddress, 5000);                                  // create the client socket and connect to port number 5000
            Stream s = client.GetStream();                                                      // create the object of stream and assign client socket stream
            StreamWriter sw = new StreamWriter(s);
            StreamReader sr = new StreamReader(s);
            sw.AutoFlush = true;                                                                // auto flush the stream writer
            sw.WriteLine("Send");
            client.Close();
            s.Close();
            Thread.Sleep(15000);
            backgroundWorker1.RunWorkerAsync();
        }
        catch (Exception ee)
        {
            MessageBox.Show(ee.ToString());
        }

    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {

        for (int i = 1; i < 10; i++)
        {
            try
            {
                TcpClient client = new TcpClient(ipaddress, 5001);                                  // create the client socket and connect to port number 5000
                Stream s = client.GetStream();                                                      // create the object of stream and assign client socket stream
                StreamWriter sw = new StreamWriter(s);
                sw.AutoFlush = true;
                sw.WriteLine(i.ToString());
                client.Close();
                s.Close();

                Thread proces = new Thread(delegate()
                {
                    int portno = 5001 + i;
                    int j = i;
                //    MessageBox.Show(portno.ToString());
                    TcpClient clientt = new TcpClient(ipaddress,portno);                                // create client socket and connect to prot number 5000   
                    using (var stream = clientt.GetStream())                                            // create the stream variable
                    using (var output = File.Create("D:\\img"+j+".png"))           // create variable output
                    {
                        var buffer = new byte[1024];                                                    // crfeate variable buffer of length 1024
                        int bytesRead;
                        while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)                 // get the number of bytes from stream and greater then
                        {
                            output.Write(buffer, 0, bytesRead);
                        }
                    }
                    backgroundWorker1.ReportProgress(j);
                    clientt.Close();
                    return;
                });
                proces.Start();
                Thread.Sleep(5200);

            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.ToString());
            }

            if (i == 9)
                i = 0;
        }
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {

        this.SuspendLayout();
        pictureBox1.Image = new Bitmap(@"D:\\img" +e.ProgressPercentage + ".png");
       if (File.Exists(@"D:\\img" + (e.ProgressPercentage - 1).ToString() + ".png"))
        {
           File.Delete(@"D:\\img" + (e.ProgressPercentage - 1).ToString() + ".png");
        }
        this.ResumeLayout();

    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }


}

}

4

0 に答える 0