WINAPI CreateThread C не всегда запускает функцию - PullRequest
0 голосов
/ 26 июня 2018

Я пишу программу на Си.

Для потока я использую библиотеку WINAPI.

Но иногда функция CreateThread не запускает ассоциированную функцию.

Я использовал функцию WaitForSingleObject с параметром INFINITE, чтобы запустить мой поток, но он никогда не запустился

Функции GetLastError всегда возвращают 0, поэтому я не знаю, где моя ошибка

Функция объединения вызывается при нажатии кнопки GTK.

Ниже вы найдете мой код

void merge(GtkWidget *wiget, gpointer data){

    HANDLE thread;
    FtpLogin *login = (FtpLogin *) data;

    thread = CreateThread(NULL, 0, mergeThread, login, 0, NULL);

    printf("%ld", GetLastError());

    WaitForSingleObject(thread, INFINITE);

    if(thread == NULL)
     puts("error");
}

DWORD WINAPI mergeThread( LPVOID lpParam )
{
   puts("Thread start");

   return 0;
}

Спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Согласно этой странице , GTK не является потокобезопасным. Все, что взаимодействует с GUI внутри вашей функции mergeThread , может привести к неожиданным результатам.

Пожалуйста, обратитесь к предоставленной мной ссылке для получения дополнительной информации о многопоточных приложениях GTK, чтобы узнать, как использовать GDK вместо этого.

0 голосов
/ 26 июня 2018

Библиотека времени выполнения C нуждается в некоторой инициализации для каждого потока. CreateThread(), который ничего не знает о C RTL, не выполняет этого.

Вместо CreateThread() используйте _beginthreadex(). Объявлено в <process.h>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...