[C z WinAPI] - wątki i rekurencja

0

Witam.

Mam funkcję

void q_sort(tab_s **tabp) //tab_s to struct z polami int start, end, *table
{
	int poczatek = (*tabp)->start;
	int koniec = (*tabp)->end;
	int *tab = (*tabp)->table;

	if (koniec > poczatek + 1)
	{
		int os = tab [poczatek];			//oś podziału tablicy
		int lewo = poczatek + 1;
		int prawo = koniec;
		while (lewo < prawo)
		{
			if (tab [lewo] <= os)
				lewo++;
			else
				zamien (&tab [lewo], &tab [--prawo]);
		}
		zamien (&tab [--lewo], &tab [poczatek]);


		(*tabp)->start = poczatek;
		(*tabp)->end = lewo;
		(*tabp)->table = tab;
		q_sort (&(*tabp));

		(*tabp)->start = prawo;
		(*tabp)->end = kazoniec;
		(*tabp)->table = tab;
		q_sort (&(*tabp));
	}
}

i teraz tak:

  1. Muszę napisać ją tak, żeby dało się ją uruchomić w wątku.
  2. Wywołania w wątkach są zawarte gdzieś w mainie.
  3. Jednak rekurencyjne wywołania funkcji już nie powinny uruchamiać się w osobnych wątkach.
  4. Zamknąć to wszystko w dll-ce i wywoływać z ASMa (ale to jak na razie przyszłość).

No i mam problem z przekazaniem tej struktury. Nie wiem, czy pisać oddzielnie funkcje wątkową, która dopiero wywołuje sorta, czy można to zrobić w jednej funkcji wątkowej.

Pozdrawiam Mrok

0
  1. http://msdn.microsoft.com/en-us/library/aa374779(VS.85).aspx
    W ThreadParameter możesz spokojnie wrzucić ten wskaźnik którego potrzebujesz.
  2. Robisz sobie w dll'ce f-cje odpalającą nowy wątek z twoim qsortem.
  3. Qsort odpalasz z funkcji w dll'ce, to spokojnie załatwi problem.
  4. Nie znam się zbytnio na wywoływaniu z Asm'a, ale samo stworzenie dll'ki to jakieś 15 minut.
0

no dobra, to powiedzmy, że mam funkcję:

static DWORD __stdcall qsort (PVOID pvParam)
{
}

to jak mam się odwołać do przekazanego structa??
tak:
tab_s pointer = (tab_s) pvParam;
?

0
MrokU napisał(a)

no dobra, to powiedzmy, że mam funkcję:

static DWORD __stdcall qsort (PVOID pvParam)
{
}

to jak mam się odwołać do przekazanego structa??
tak:
tab_s pointer = (tab_s) pvParam;
?

albo tak(bez tworzenia kolejnej zmiennej)

((tab_s**)pvParam)->jakies_pole=cos_tam;

brzydkie w zapisie ale działa :>

0
MrokU napisał(a)

Nie wiem, czy pisać oddzielnie funkcje wątkową, która dopiero wywołuje sorta, czy można to zrobić w jednej funkcji wątkowej.
Może to być jedna funkcja. Pierwsze jej wywołanie będzie przez CreateThread, następne już rekurencyjnie przez wątek. Jednak dla lepszej czytelności (tab_s** a nie PVOID) i elastyczności rozwiązania (a nuż trzeba będzie coś jeszcze przekazać do wątku) odseparowałbym jedno od drugiego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1