Autor Wątek: Wątki, klasy zmienianie wartości zmiennych  (Przeczytany 1162 razy)

Offline Marcineg

  • Użytkownik

# Czerwiec 08, 2012, 15:48:59
Witam,
Mam problem z działaniem wątku. Chciałbym by klasa tworzyła sobie wątek, w nim przeprowadzała obliczenia, a na koniec w zmiennej umieściła rozwiązanie. Potem, w głównym wątku chciałbym mieć dostęp do tej wartości. Przykładowy kod:
#include "stdio.h"
#include "windows.h"

DWORD WINAPI MyThread( LPVOID lpParam );

class a
{
public:
a():num(0) {znak = new char [1];}
~a() {delete [] znak;}
void test();
volatile int num;
char *znak;
};

void a::test()
{
HANDLE Thread;
num = 14;
znak[0] = '.';
CreateThread(NULL, 0, MyThread, this, 0, NULL);
WaitForSingleObject(Thread, INFINITE);
}

DWORD WINAPI MyThread( LPVOID lpParam )
{
a *_this = (a*)lpParam;
_this->num = 15;
_this->znak[0] = '!';
return 0;
}

int main(array<System::String ^> ^args)
{
a b;
b.test();
printf("Hello World %i", b.num);
printf("%c", b.znak[0]);
Sleep(1000);
return 0;
}

Zastanawiam się czemu wynik działania, przy pierwszym uruchomieniu, to "Hello World 14." a przy następnych "Hello World 14!"
Chciałbym, aby wynik jednak wyglądał tak: "Hello World 15!"
Prawdopodobnie problem jest w tym, że średnio rozumiem wątki. Liczę na jakąś radę, jak mógłbym rozwiązać swój problem.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline radsun

  • Użytkownik
    • CaRpg

# Czerwiec 08, 2012, 16:00:03
Żeby nie było za łatwo to błąd jest w tej linijce:
WaitForSingleObject(Thread, INFINITE);Gdybyś używał debuggera to sam wskazał by ci błąd ;)

Offline Marcineg

  • Użytkownik

# Czerwiec 08, 2012, 16:37:34
:O
Idiotyczny błąd, dzięki :)
Ale nie do końca rozwiązuje mój problem :( postaram się zaraz napisać kod, który lepiej ilustruje mój problem.

Dobra dział... problem nie był z wątkami ani klasą, tylko z wektorem. Wyszło, że nie umiem używać wektorów ;)
« Ostatnia zmiana: Czerwiec 08, 2012, 17:05:32 wysłana przez Marcineg »

Offline Interceptor

  • Użytkownik

# Czerwiec 08, 2012, 18:00:33
Jak bawisz sie watkami to polecam uzyc biblioteki TinyThread.

Offline Kos

  • Użytkownik
    • kos.gd

# Czerwiec 08, 2012, 19:13:48
A ja polecam używać standardowego C++, a nie bibliotek konkretnego systemu. :) Będziesz kiedyś chciał odpalić na linuksie albo macu i lipa...

Pogooglaj o std::thread, jest bardzo wygodne (no dobra, trudno by coś było mniej wygodne od WinAPI :D). To trochę nowinka, ale aktualne wersje "dużych" kompilatorów już to chyba wspierają.

Offline Frondeus

  • Użytkownik

# Czerwiec 08, 2012, 19:15:55
MINGW już wspiera? Super :D

Offline Kos

  • Użytkownik
    • kos.gd

# Czerwiec 08, 2012, 21:34:06
MinGW chyba jeszcze nie. :) Słyszałem coś, że da się włączyć w cfg, ale to dla mnie na razie mitologia. (Nie zaszkodzi sprawdzić na nuwenie itp). No i boost::thread ma niby podobny interfejs, można używać jako zaślepkę.

Offline Aithne

  • Użytkownik

# Czerwiec 08, 2012, 21:39:32
Wspiera, już o tym pisałam:
Od 4.7 jest obsługiwany (starsze wersje trzeba patchować), skompiluj GCC z --enable-threads=posix ;)
Nie chcesz kompilować kompilatora? MinGW-w64 właśnie takie gotowe GCC ma. O, na przykład tutaj (nie testowałam).
« Ostatnia zmiana: Czerwiec 08, 2012, 21:43:31 wysłana przez Aithne »