for (int x = 0; x < blockCountX; x++)
{
for (int y = 0; y < blockCountY; y++)
{
//get blocks from image to new image and send to threaded processor
imageBlocks[x, y] = image.Clone(clipRectangle, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(ThreadedFromHeightMap));
t.Start(imageBlocks[x,y]);
clipRectangle.Offset(0, IMAGEBLOCKSIZE);
}
clipRectangle.Offset(IMAGEBLOCKSIZE, clipRectangle.Location.Y * -1);
}
break;
}
}
private void ThreadedFromHeightMap(object Image)
{
Bitmap image = (Bitmap)Image;
int width = image.Width;
int height = image.Height;
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
map.Hexes.Add(new Point(x, y), new Hex(image.GetPixel(x, y).B));
//tempHexes.Enqueue(new Hex(image.GetPixel(x, y).B));
}
}
}
Я пытаюсь взять данные пикселей из карты высот в оттенках серого 2048 x 2048 пикселей на дюйм и строю шестнадцатеричную карту с соответствующими значениями высоты. Я храню гексы в коллекции словарей. В общей сложности в коллекции ~ 4 миллиона гексов.
Чтобы сделать это эффективно, я разбиваю изображение на 256 x 256 фрагментов и передаю это изображение другому потоку, который будет анализировать его и добавлять гексы в коллекцию. Это все, что сходит с ума. Вместо одного изображения с (0,0) в верхнем левом углу у меня теперь есть 64 фрагмента изображения, которые имеют (0,0) в качестве верхнего левого угла. Однако я использую расположение пикселей в качестве индекса для словаря. Это происходит сбой, когда второй поток пытается добавить другое значение с индексом (0,0).
Как мне решить эту проблему? Я подумал о создании класса, который просто имеет элемент изображения и элемент номера чанка и передает его потоку, чтобы я мог отрегулировать положение пикселя в зависимости от того, над каким фрагментом работает поток, но это кажется неоптимальным.
(Я понимаю, что используемый мной словарь не безопасен для потоков. С тех пор я исправил это.)