Как не использовать CreateGraphics в многопоточном приложении? - PullRequest
0 голосов
/ 07 июля 2019

У меня есть приложение, которое рисует фрактал Мандельброта на панели, и некоторое время назад я сделал его многопоточным с некоторой помощью и большим количеством попыток. Я сделал это с помощью CreateGraphics в каждом из потоков, поскольку я не мог использовать PaintEventArgs вне события Paint. Теперь я хочу реализовать эффективное сохранение изображений, хотя, если это возможно (можно было бы однопоточным образом нарисовать всю картинку снова, просто чтобы сохранить ее). Но я не смог сохранить содержимое панели. Я прочитал много вопросов здесь и в других местах и ​​пришел к выводу, что это потому, что я использовал CreateGraphics. Поэтому я хочу прекратить использовать CreateGraphics. Но тогда на что я опираюсь?

Я пытался передать PaintEventArgs из метода Paint методам для отдельных потоков, но безуспешно.

Скажем, у меня есть метод DoWork (я прочитал Документы: P), я бы начал с этого.

{
   thread.Abort();
   thread = new Thread(DoWork);
   thread.Start(pea)
}

Тогда я могу сделать две вещи для DoWork: либо void DoWork(PaintEventArgs pea) или же void DoWork(object pea)

Первый случай не разрешен, а во втором случае я не могу использовать pea.Graphics.DrawImage.

Edit: Вот код одного из методов рисования (DoWork в примере выше), чтобы проиллюстрировать, почему я использовал CreateGraphics.

        void TekenVanOnderen()
        {
            Bitmap bitmap = new Bitmap(tekenpaneel.Width, 1);
            using (Graphics g = tekenpaneel.CreateGraphics())
            {
                for (int y = tekenpaneel.Height ; y > tekenpaneel.Height / 2; y--) // De andere kant op
                {
                    for (int x = 0; x < tekenpaneel.Width; x++) 
                    {
                        double xklein = x / schaal - (tekenpaneel.Width / schaal / 2) + middenx;
                        double yklein = -1 * (y / schaal - (tekenpaneel.Width / schaal / 2)) + middeny;

                        bitmap.SetPixel(x, 0, Kleurenopties(xklein, yklein));
                    }
                    g.DrawImage(bitmap, 0, y);
                }
            }
        }
...