Cześć,
mam problem z wątkami w C#.
Zadaniem programu jest zamiana kolorowej mapy bitowej w czarnobiałą. GreyScale1 jest funkcją napisaną w C++ i dołączoną za pomocą dll (działa poprawnie).
Mimo wywoływania metody Join(), program kończy się zanim skończą się wszystkie wątki (na obrazie pozostają nie przetworzone paski).
Problematyczny fragment kodu:
int begin = 0;
int end = 0;
int interval = myBitmap.R_tab.Length / trackBar_NumberOfThreads.Value;
Thread[] threadTable = new Thread[trackBar_NumberOfThreads.Value];
for (int i = 0; i < trackBar_NumberOfThreads.Value; i++)
{
if (begin + end <= myBitmap.R_tab.Length)
end = begin + interval;
else
end = myBitmap.R_tab.Length;
threadTable[i] = new Thread(() => GreyScale1(myBitmap.R_tab, myBitmap.G_tab, myBitmap.B_tab, begin, end));
threadTable[i].Start();
begin = end;
}
foreach(Thread thread in threadTable)
{
thread.Join();
}
Objaśnienia:
- myBitmap - klasa do której wczytuję mapę bitową
- begin, end - zmiene służące do wyliczenie indeksów tablicy na jakiej pracować ma wątek
Co ciekawe deklarując w programie liczbę wątków w taki sposób, wszystko działa poprawnie
Thread t1 = new Thread(() => GreyScale1(myBitmap.R_tab, myBitmap.G_tab, myBitmap.B_tab, 0, myBitmap.B_tab.Length/4));
t1.Start();
Thread t2 = new Thread(() => GreyScale1(myBitmap.R_tab, myBitmap.G_tab, myBitmap.B_tab, myBitmap.B_tab.Length / 4, myBitmap.B_tab.Length/2));
t2.Start();
Thread t3 = new Thread(() => GreyScale1(myBitmap.R_tab, myBitmap.G_tab, myBitmap.B_tab, myBitmap.B_tab.Length / 2, (myBitmap.B_tab.Length / 4)*3));
t3.Start();
Thread t4 = new Thread(() => GreyScale1(myBitmap.R_tab, myBitmap.G_tab, myBitmap.B_tab, ((myBitmap.B_tab.Length / 4) * 3), myBitmap.B_tab.Length));
t4.Start();
t1.Join();
t2.Join();
t3.Join();
t4.Join();
Już drugi dzień nad tym siedzę i nie potrafię znaleźć błędu