嵌套的“for”循环除以线程

时间:2014-11-14 13:15:56

标签: multithreading loops for-loop divide

 for (int y=pocz;y<kon;y++)
            {
                    for (int x = 0; x < obrazekKopia.Width; x++)
                    {
                        if (((wskWejsciowy[0] + wskWejsciowy[1] + wskWejsciowy[2])/3 < 128))
                        {
                            wskWyjsciowy[0] = wskWyjsciowy[1] = wskWyjsciowy[2] = 0;
                        }
                        else
                        {
                            wskWyjsciowy[0] = wskWyjsciowy[1] = wskWyjsciowy[2] = 255;
                        }
                        wskWejsciowy += 3;
                        wskWyjsciowy += 3;
                    }
                    wskWejsciowy += nOffset;
                    wskWyjsciowy += nOffset;
                }
            }

我上学的任务是将它划分给线程。程序将单色图像转换为B&amp; W. 线程数必须“按用户需要”。我尝试了很多东西,我不能自己做。这是我的第一个C#程序,请帮帮我!

你问我做了什么:

     Thread1 []tab = new Thread1[liczbaWatkow];
            ThreadStart[] pts = new ThreadStart[liczbaWatkow];
            Thread[] t = new Thread[liczbaWatkow];
            for (int s = 0; s < liczbaWatkow; s++)
            {
                pts[s] = delegate
                             {
                                 tab[s] = new Thread1();
                                 tab[s].wykonaj(prog, obrazekKopia, wskWejsciowy, wskWyjsciowy, pocz, kon, nOffset);
                             };
                pocz += obrazekKopia.Height / liczbaWatkow;
                kon += obrazekKopia.Height / liczbaWatkow;
                t[s] = new Thread(pts[s]);
            }



                        for (int i = 0; i < liczbaWatkow; i++)
                        {
                            t[i].Start();
                        }

  public class Thread1
    {
        public Thread1() { }
        public unsafe void wykonaj(int prog, Bitmap obrazekKopia, byte* wskWejsciowy, byte* wskWyjsciowy, int pocz, int kon, int nOffset)
        {
            int prog2 = prog * 3;
            unsafe
            {
                for (int y = pocz; y < kon; y++)
                {
                    for (int x = 0; x < obrazekKopia.Width; x++)
                    {
                        if (((wskWejsciowy[0] + wskWejsciowy[1] + wskWejsciowy[2]) < prog2))
                        {
                            wskWyjsciowy[0] = wskWyjsciowy[1] = wskWyjsciowy[2] = 0;
                        }
                        else
                        {
                            wskWyjsciowy[0] = wskWyjsciowy[1] = wskWyjsciowy[2] = 255;
                        }
                        wskWejsciowy += 3;
                        wskWyjsciowy += 3;
                    }
                    wskWejsciowy += nOffset;
                    wskWyjsciowy += nOffset;
                }
            }
        }

我不是一个懒惰的人,希望你解决问题

2 个答案:

答案 0 :(得分:0)

很抱歉,使用神秘的词汇阅读代码有点困难,我猜测,波兰语或捷克语。

其中一个解决方案是将图像分成几部分,并将您在代码段中显示的算法应用于每个部分。这归结为将阵列分成几部分。所以,如果你有一个300像素和3个线程的数组,每个线程将获得他自己的100个像素,这将变成黑色和白色。之后,您可以再将这三个单色阵列加入其中。

我可以给你代码,但我认为这对你没用。相反,我只是为您提供相应文档的参考:http://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx

编辑:

你没有编辑过你的问题我可以帮助你更多。您正在将完整的位图传递给您的线程。相反,你应该只传递它的第N部分,其中N是线程的数量,而不是你已经在做的事情。

答案 1 :(得分:0)

你有一个循环为所有线程调用Start。您还必须有一个为所有线程调用Join的循环,以便您可以等待线程完成。完成所有线程后,您可以使用线程生成的数据。