FAQ:WinAPI VCPP:передача нескольких параметров в процедуру потока

Материал из Весельчак У
Версия от 20:27, 2 ноября 2008; RXL (обсуждение | вклад) (Разделение FAQ на статьи.)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Как передать больше одного параметр в процедуру потока?

Для этого нужно определить структуру со всеми параметрами (или указателями на них), которые нужно передать. А в процедуру потока передать лишь указатель на заполненную структуру.

Пример:

struct mystr
{
	CEdit* pEd;
	CDialog* pDlg;
	DWORD* pdwd;
	int *pn;
};

запуск потока:

mystr *pparam=new mystr; // экземпляр не должен быть временным!!!
 
memset(pparam, 0, sizeof(*pparam));
pparam->pEd=...;
pparam->pdwd=...;
 
::AfxBeginThread(thread, pparam);
// тут экземпляр *(pparam) уже нельзя использовать в нашем примере, так как
// он у нас удалился в процедуре потока

Процедура потока:

// поток:
UINT threadLoader(LPVOID pParam)
{
	// копируем данные из структуры в локальную структуру
	mystr data=*((mystr*)pParam);
	// освобождаем память временной структуры
	delete ((mystr*)pParam);
	pParam=0;
 
	...
	data.pDlg->...;
	(*data.pdwd)=...;
	...
}