Member 12321673 Ответов: 1

Как исправить управление, используемое другим процессом


Привет, я хочу сделать программу read image form pc и сделать несколько процессов одновременно проблема заключается в том, что " растровое изображение используется другим процессом.
Пожалуйста помочь ...

Это мой код.:

Что я уже пробовал:

public partial class Form1 : Form
    {
        Bitmap OriginalImage;
        public int pi_depth;
        public Form1()
        {
            InitializeComponent();
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                OriginalImage = new Bitmap(ofd.FileName);
                this.pictureBox1.Image = OriginalImage;
            }
        }
            public double DEPTH_PIXEL(int x1, int y1, int x2, int y2,Bitmap bmp)
            {
                double depthcalc = 0;
                for (int y = y1; y < y2; y++)
                {
                    for (int x = x1; x < x2; x++)
                    {
                        depthcalc = depthcalc + bmp.GetPixel(x, y).R;
                    }
                }
                //pi_depth = (max - pi_depth) / 255; //black
                bmp.Dispose();
                return depthcalc;

       
        }

            private void CMD_PARALLEL_Click(object sender, EventArgs e)
            {
                parallelfun(OriginalImage);
            }
            public void parallelfun(Bitmap bmpin)
            {
                int[] nums = { 1, 2, 3, 4 };
                int[] VALX1 = { 000, 201, 301, 401 };
                int[] VALY1 = { 000, 201, 301, 401 };
                int[] VALX2 = { 200, 300, 400, 500 };
                int[] VALY2 = { 200, 300, 400, 500 };
                Parallel.ForEach(nums, new ParallelOptions() { MaxDegreeOfParallelism = 5 }, item =>
                {
                    double DEPTH = DEPTH_PIXEL(VALX1[item - 1], VALY1[item - 1], VALX2[item - 1], VALY2[item - 1], bmpin);
                    Result(DEPTH.ToString());
                });
            }
            public void Result(string result)
            {
                if (listBox1.InvokeRequired)
                    listBox1.Invoke((MethodInvoker)delegate()
                    {
                        listBox1.Items.Add(result);
                    });
                else
                    listBox1.Items.Add(result);
            }
    }

Gerry Schmitz

БМП.Распоряжаться();

Member 12321673

Извините но это не помогло я попробовал это сделать

1 Ответов

Рейтинг:
0

RickZeeland

Вы не можете использовать то же самое растровое изображение снова, как вы это делаете в

parallelfun(OriginalImage);
вместо этого вам придется создать новый, как в следующем примере:
Bitmap original = new Bitmap("Test.jpg");
  long mem1 = Process.GetCurrentProcess().PrivateMemorySize64;
  Stopwatch timer = Stopwatch.StartNew();

  List<Bitmap> list = new List<Bitmap>();
  Random rnd = new Random();
  for(int i = 0; i < 50; i++)
  {
    list.Add(new Bitmap(original));
  }

  long mem2 = Process.GetCurrentProcess().PrivateMemorySize64;
  Debug.WriteLine("ElapsedMilliseconds: " + timer.ElapsedMilliseconds);
  Debug.WriteLine("PrivateMemorySize64: " + (mem2 - mem1));

Для получения дополнительной информации см.: c# - в чем разница между Bitmap.Clone() и new Bitmap(растровое изображение)? - переполнение стека[^]

Но я боюсь, что ... Метода getpixel и Методом setpixel просто не может безопасно использоваться в параллельной обработке, см.: c# - параллель.Для постановки системы возврата ".InvalidOperationException" с обработкой растрового изображения - переполнение стека[^]

Вы можете использовать приведенный здесь пример, который работает с буфером: c# - разрешить доступ к изображению нескольким потокам - переполнение стека[^]


Member 12321673

Спасибо за повтор, но это пока ....

BillWoodruff

+5