Как получить возвращаемое значение первого параметра _StartAddress функции _beginthread - PullRequest
2 голосов
/ 19 сентября 2011

Я хотел сделать что-нибудь, используя многопоточность и все вещи, инкапсулированные в функции foo.

filterThread = _beginthread (foo, 0,NULL) ;

и я хотел дать foo возвращаемое значение:

int foo()
{
    return iRet;
}

но прототип _beginthread _CRTIMP uintptr_t __cdecl _beginthread (_In_ void (__cdecl * _StartAddress) (void *), _In_ unsigned _StackSize, _In_opt_ void * _ArgList) показывает, что foo должно быть недействительным, что означает, что не может возвращать значение. Можно ли еще как-нибудь разрешить foo возвращаемое значение?

Ответы [ 2 ]

2 голосов
/ 19 сентября 2011

Вместо этого используйте _beginthreadex. Это позволяет использовать функцию, которая возвращает значение. Затем вы можете использовать GetExitCodeThread, чтобы получить значение после завершения потока.

1 голос
/ 19 сентября 2011

Чтобы получить возвращаемое значение или код завершения потока:

Вызвать эту функцию на дескрипторе потока после его завершения,

DWORD ExitCode;
GetExitCodeThread(hThread, &ExitCode);

Например,рассмотрите возможность использования _beginthreadex,

unsigned __stdcall foo( void* pArguments )
{
    _endthreadex( 0 );
    return 0;
} 

int main()
{ 
    HANDLE hThread;
    unsigned threadID;

    hThread = (HANDLE)_beginthreadex( NULL, 0, foo, NULL, 0, &threadID );

    WaitForSingleObject( hThread, INFINITE );

    CloseHandle( hThread );
}
...