ОК, для начала, это взорвется:
struct Data *tData;
tData->threads = numThreads;
tData->messages = 3;
tData->delay = 1000;
... потому что вы создали переменную типа «указатель на структуру», но не инициализировали указатель, чтобы указывать на что-либо. tData
неинициализирован, поэтому вы пишете в дикий указатель .
Возможно, вы захотите что-то вроде этого:
// Allocate memory for the struct on the heap
struct Data *tData = malloc( sizeof(struct Data) );
// Initialize _all_ fields of the struct (malloc won't zero fill)
tData->threads = numThreads;
tData->messages = 3;
tData->delay = 1000;
Во-вторых, вы передаете адрес из tData
(место в памяти, где находится переменная tData
), а не место в памяти, на которое указывает tData
до
// Create child thread
hThread = CreateThread( ...,
&tData, // OOPS - ADDRESS OF THE POINTER VARIABLE ITSELF!
... );
Вы, вероятно, хотите передать значение указателя (адрес структуры, на которую он указывает):
// Create child thread
hThread = CreateThread( ...,
tData, // Value of the pointer
... );
Когда вы получите адрес структуры в вашей функции обратного вызова, приведите его к исходному типу указатель на структуру, разыщите и наслаждайтесь:
DWORD WINAPI ThreadFunc(LPVOID threadData)
{
struct Data *tData = (struct Data *)threadData;
int numMessages = tData->messages;
// ...
}