Функция вызова библиотеки потоков с параметром - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь использовать следующую функцию моей библиотеки в потоке:

typedef void (*TIPO_FUNCION_APARCAR_COMMIT)       (HCoche hc);
typedef void (*TIPO_FUNCION_PERMISO_AVANCE)       (HCoche hc);
typedef void (*TIPO_FUNCION_PERMISO_AVANCE_COMMIT)(HCoche hc);
int PARKING2_aparcar(HCoche,void *datos,TIPO_FUNCION_APARCAR_COMMIT,
                                             TIPO_FUNCION_PERMISO_AVANCE,
                                             TIPO_FUNCION_PERMISO_AVANCE_COMMIT);

Но я не могу понять, как я могу это вызвать, потому что в CreateThread() входным параметром является LPVOID и я не вижу, как я могу его использовать.

Я попробовал этот синтаксис, но он не работает:

CreateThread(0, 0, fPARKING2_apagar, {&hc,(LPTHREAD_START_ROUTINE)fPARKING2_getDatos(hc), &commit, &goForward, &goForwardCommit}, NULL, NULL, &threadId);

Я также пытался использовать std::thread,но, похоже, у меня нет C ++ 11, поэтому я не могу его использовать.

1 Ответ

0 голосов
/ 11 мая 2018

Функция fPARKING2_apagar(), которую вы пытаетесь передать CreateThread(), не соответствует сигнатуре, которую ожидает CreateThread().Сигнатура вашей функции потока ДОЛЖНА соответствовать сигнатуре ThreadProc():

DWORD WINAPI ThreadProc(_In_ LPVOID lpParameter);

Кроме того, вы пытаетесь передать анонимную структуру параметру lpParameter CreateThread().Это также не сработает.

Вам нужно написать функцию-обертку, которую вы можете передать CreateThread(), и затем эта обертка сможет вызвать библиотечную функцию.Используйте параметр lpParameter CreateThread(), чтобы передать пользовательские данные в функцию потока, которая затем может передать их в библиотечную функцию по мере необходимости.

Попробуйте что-то более похожее на это:

struct PARKING2_aparcar_params
{
    HCoche hc;
    void *datos;
    TIPO_FUNCION_APARCAR_COMMIT aparcarCommit;
    TIPO_FUNCION_PERMISO_AVANCE permisoAvance;
    TIPO_FUNCION_PERMISO_AVANCE_COMMIT permisoAvanceCommit;
};

DWORD WINAPI PARKING2_aparcar_wrapper(LPVOID lpParameter)
{
    PARKING2_aparcar_params *params = static_cast<PARKING2_aparcar_params*>(lpParameter);
    fPARKING2_aparcar(params->hc, params->datos, params->aparcarCommit, params->permisoAvance, params->permisoAvanceCommit);
    delete params;
    return 0;
}

...

PARKING2_aparcar_params *params = new PARKING2_aparcar_params;
params->hc = hc;
params->datos = fPARKING2_getDatos(hc);
params->aparcarCommit = &commit;
params->permisoAvance = &goForward;
params->permisoAvanceCommit = &goForwardCommit;

hThread = CreateThread(NULL, 0, &PARKING2_aparcar_wrapper, params, 0, &threadId);
if (!hThread)
    delete params;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...