Pisze program w C# oparty na watkach , w ktorym wystepuje nastepujaca deklaracja(do kazdego z watkow
przypisana jest funkcja "downloading" uruchamiana z
obiektu typu "EMule") :
EMule []clients = new EMule[nPeers];
Thread[] threads = new Thread[nPeers];
for (i = 0; i < nPeers; i++) clients[i] = new EMule(updownRate(rates, mUpload), updownRate(rates, mDownload), nFiles, pieces, rand);
for (i = 0;i < nPeers-1; i++)
threads[i] = new Thread(delegate()
{
clients[i].downloading(clients[i+1]);
});
threads[nPeers - 1] = new Thread(delegate()
{
clients[nPeers - 1].downloading(clients[0]);
});
Następnie uruchamiam watki:
for (i = 0; i < nPeers; i++) threads[i].Start();
Program reaguje bardzo roznie , jednak zawsze konczy sie na bledzie:
IndexOutOfRangeException w linijce:
for (i = 0;i < nPeers-1; i++)
threads[i] = new Thread(delegate()
{
clients[i].downloading(clients[i+1]);<--------- ta linijka smile
});
Sytuacja dla mnie kompletnie nie zrozumiala jako że
liczba zaalokowanych klientow jest OK. Patrzylem tez na to w debugerze i nie wyglada na to zeby zakres zostal przekroczony
Co ciekawe kiedy do wątków przypisze funkcje nie uzywajac petli for tylko "na pale",tak jak tutaj:
threads[0] = new Thread(delegate()
{
clients[0].downloading(clients[1]);
});
threads[1] = new Thread(delegate()
{
clients[1].downloading(clients[2]);
});
itp...
program dziala bezproblemowo. Strasznie sie z tym mecze prosze o jakies sugesti i z gory dziekuje za pomoc.</cpp>