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

Материал из Весельчак У

Перейти к: навигация, поиск

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

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

Пример:

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)=...;
...
}