C # Threading Растровые объекты / PictureBox - PullRequest
1 голос
/ 26 марта 2011

У меня есть какой-то код для отображения видео-графики движущихся точек.

Я записываю точки в растровое изображение и помещаю его в графический блок.

Вычисление графики должно выполняться в собственном потоке. Графика работает нормально, если вы не слишком много перемещаете окно.

Я использую winforms. Когда я запускаю код и дико перемещаю окно, я ИНОГДА получаю следующие ошибки:

@ this.Invoke (d, новый объект [] {bmp }); "Невозможно получить доступ к удаленному объект. Имя объекта: 'Form1'. "

@ gfx.DrawImage (bmpDestination, new Точка ()); «Объект находится в использовать в другом месте. "

Вот код:

private void button2_Click(object sender, EventArgs e)
        {
            Thread demoThread = new Thread(new ThreadStart(ThreadProcSafe));

            demoThread.Start();
        }

        private void ThreadProcSafe()
        {
            creategraphics();
        }

        private void creategraphics()
        {

                Bitmap bmpDestination = new Bitmap(988, 588);
                Bitmap bmp = new Bitmap(988, 588);


                for (int i = 0; i < numtimesteps; i++)
                {
                    bmp = GraphingUtility.create(apple, i, 988, 588, -30, 30, -30, 30);

                        using (Graphics gfx = Graphics.FromImage(bmp))
                        {
                            gfx.DrawImage(bmpDestination, new Point());
                        }
                        bmpDestination = bmp;
                        updateimage(bmp);
                }
        }

        delegate void graphicscallback(Bitmap bmp);

        private void updateimage(Bitmap bmp)
        {
                if (pictureBox1.InvokeRequired)
                { 
                   graphicscallback d = new graphicscallback(updateimage);
                   this.Invoke(d, new object[] { bmp });
                }
                else
                { 
                    pictureBox1.Image = bmp;
                    pictureBox1.Refresh();  
                }
        }

Ответы [ 2 ]

0 голосов
/ 26 марта 2011

Невозможно получить доступ к удаленному объекту.Имя объекта: 'Form1

Вы получаете это, потому что вы ничего не делаете, чтобы остановить поток, когда пользователь закрывает форму.Вы должны будете поддерживать форму, пока не узнаете, что нить мертва.Достаточно сложно сделать надежный, проверьте этот ответ для решения.

Кроме того, вызов InvokeRequired является анти-паттерном.Вы знаете , что делаете вызов из рабочего потока.Если InvokeRequired вернет false, значит что-то действительно не так.Не беспокойтесь, вызывайте Invoke () напрямую.

Объект в настоящее время используется в другом месте

Это исключение, вызванное GDI + (Graphics), когда он видит, что двапотоки пытаются получить доступ к растровому изображению одновременно.Это не очевидно в вашем фрагменте, но я не вижу, что делает GraphingUtility.create ().Убедитесь, что он создает новое растровое изображение, а не возвращает существующее.Потому что это будет бомбить, когда ваш поток пишет в него снова, и окно изображения перерисовывает себя в то же время.Конструктор bmp, который вы используете выше, ничего не делает.

Ваше назначение PictureBox.Image забывает утилизировать старый.

0 голосов
/ 26 марта 2011

Есть проблемы с использованием объектов GDI в разных потоках.

Посмотрите на предложения Ханса о двойном клонировании в этой теме .

...