z MSDN:
HANDLE WINAPI CreateThread(
In_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
In SIZE_T dwStackSize,
In LPTHREAD_START_ROUTINE lpStartAddress,
In_opt LPVOID lpParameter,
In DWORD dwCreationFlags,
Out_opt LPDWORD lpThreadId
);
zakładając, że masz klasę np.:
class Pojazd
{
public:
void Odpal()
{
odpalony = true;
CreateThread(NULL, 0, Watek, (void*)this, 0, &idWatku);
}
void Zgas()
{
odpalony = false;
}
// jakies inne operacje
private:
volatile bool odpalony;
DWORD idWatku;
static DWORD WINAPI Watek(void* p)
{
Pojazd& p = *((Pojazd*)p); // na tym obiekcie operujesz w watku
while (p.odpalony)
{
// tutaj cos rob
Sleep(1); // tutaj odczekaj chwile po kazdej operacj
}
}
};
Pojazdy odpalasz tak:
Pojazd pojazdy[8]; // musisz zadbac o to zeby te obiekty istnialy dopoki wszystkie watki sie nie zakoncza
for (int i =0; i < 8; i++)
{
pojazdy[i].Odpal();
}
pisane z palca mogą być błędy.
zamiast dbania o obiekty możesz wykorzystać również np. taki szablon:
class Pojazd
{
//... (to samo co wczesniej)
static DWORD WINAPI Watek(void* p)
{
Pojazd& p = *((Pojazd*)p); // na tym obiekcie operujesz w watku
while (p.odpalony)
{
// tutaj cos rob
Sleep(1); // tutaj odczekaj chwile po kazdej operacj
}
delete this;
}
};
i odpalasz watki tak:
Pojazd* pojazdy[8]; // musisz zadbac o to zeby te obiekty istnialy dopoki wszystkie watki sie nie zakoncza
for (int i =0; i < 8; i++)
{
pojazdy[i] = new Pojazd();
pojazdy[i]->Odpal();
}
na końcu programu czekasz aż wszystkie wątki się zakończą, ale nie zwalniasz pamięci, bo wątek o to dba. Osobiście wolę opcję ze stosem.