[WinAPI] Watek zapisany w dynamicznej bibliotece

0

Witam,
postanowilem pobawic sie w tworzenie bibliotek dll, jednoczesnie ucze sie watkow. Stworzylem sobie najpierw program, gdzie mam watek sprawdzajacy ilosc uzywanego RAMu. Wyglada to mniej wiecej tak:

DWORD WINAPI MojWatekRAM(PVOID pParam) {
	uzytyRAM = (InfoPFizTotal()-InfoPFizPozostala())/(1024*1024);
	return 0;
}

int wmain() {
....
		watekRAM = CreateThread(NULL, 0, MojWatekRAM, NULL, 0, NULL);
		_tprintf(_T("RAM: %d MB\n"), uzytyRAM);
...
}

Wszystko pieknie dziala, ale gdy robie biblioteke dll i eksportuje watek, zmienna uzytyRAM zawsze jest rowna 0, jakby watek sie nie wykonywal. Czy w ogole mozna zawierac w watki dllach?

0

Jak zadeklarowałeś zmienną? Globalną / statyczną? Jeszcze inaczej?

0

uzytyRAM to zmienna globalna ktora rowniez jest eksportowana w DLLu. W pliku naglowkowym wpisalem _declspec(dllexport) double uzytyRAM;

0

W menedżerze zadań na zakładce procesy włącz sobie kolumnę wątki i zobacz ile Ci się ich wykonuje.

0
DWORD WINAPI MojWatekRAM(PVOID pParam) {
	uzytyRAM = (InfoPFizTotal()-InfoPFizPozostala())/(1024*1024);  //YYYYY
	return 0;
}

int wmain() {
....
		watekRAM = CreateThread(NULL, 0, MojWatekRAM, NULL, 0, NULL); //start watku
                          //aaaaaaaaa
                         	_tprintf(_T("RAM: %d MB\n"), uzytyRAM);  ///XXXXX

...
}

a jaka masz gwarancje, ze po wykonaniu START WATKU i przed wejsciem do lini XXXX watek zdazy wykonac YYYYY ? przeciez watek glowny nadal pracuje i mozliwe jest, ze tworzy watek poboczny i leci dalej bez oczekiwania.

sprobuj dac Sleep(20*1000); (czekanie 20sekund) w miejscu oznaczonym 'aaaaaaaaa' - jelsi to ten przypadek, to moze Ci sie wtedy liczba wyswietli. ah, i oczywiscie Sleep to nie jest wlasciwa metoda synchronizacji :)

0

Owszem, uzywalem sleep ustawiony na 1 sekunde i czytalem, ze to nie jest synchronizacja ;). Moj watek jest krotki i byloby niemozliwe zeby jej wykonanie trwalo dluzej, co wiecej, w programie taki czas wystarczal na wykonanie sie w calosci watku. Nie zmienia to jednak faktu, ze mam zamiar to zmienic ;).
Wczoraj zamiast zmiennej globalnej stworzylem strukture w moim dllu, i podawalem jej adres przy CreateThread. Poczatkowo wynik pracy byl taki sam, ale dzisiaj, po ponownym wlaczeniu kompilatora wszystko dziala jak nalezy.
Dziekuje za pomoc :).

0

A ja mam inny problem z bibliotekami.
Może mi ktoś pomóc czego brakuje mi w tym programie aby wynik był zwracany z biblioteki do programu głównego? Co robię nie tak?
Dopiero się uczę i nie wiem co i jak do czego służy, także gdzie można uzyskać jakąś listę poleceń do C++ i wyjaśnienie do każdego z poleceń ?

Link do mojego programu: http://www.mediafire.com/?2ijwtyyrdfw

Program ten tworzyłem w Borland C++ Builder Enterprise.

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