【问题标题】:WINAPI CreateThread C not always launch functionWINAPI CreateThread C 不总是启动函数
【发布时间】:2018-12-05 11:59:16
【问题描述】:

我正在编写一个 C 程序。

对于线程,我使用 WINAPI 库。

但有时 CreateThread 函数不会启动函数关联。

我使用带有 INFINITE 参数的 WaitForSingleObject 函数让我的线程启动,但他从不启动

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;
}

感谢您的帮助

【问题讨论】:

  • 您需要提供有关您遇到的错误或错误行为的更多详细信息。看看minimal reproducible example
  • @PatrickMevzek 感谢您的评论。我没有任何错误,线程只是没有启动。 GetLastError 函数从不返回错误代码。
  • CreateThread 总是启动你的函数,为什么你决定 mergeThread 没有执行?
  • puts("线程开始\n");也许吧。

标签: c winapi


【解决方案1】:

C 运行时库需要一些每个线程的初始化。 CreateThread() 对 C RTL 一无所知,不会执行此操作。

使用_beginthreadex() 代替CreateThread()。它在<process.h> 中声明。

【讨论】:

  • 感谢您的回答。同样的问题。该函数并不总是被调用。我认为问题来自 GTK,而我在主线程上调用该函数
  • @M5623 - 你错了。首先你的函数被调用。第二次puts失败
  • @RbMm 感谢您的回答,您的意思是 puts 不是线程安全的?
  • @M5623 没有,但是puts 使用了一些 c/c++ 运行时环境,不会在CreateThread 创建的线程中初始化。或不在此线程中使用 c/c++ 运行时,或使用内部调用 CreateThread_beginthreadex + 执行所需的运行时初始化。所以我们评论的答案是正确的
  • 这个答案在很久以前是正确的,但现在不是了
【解决方案2】:

根据this page,GTK 不是线程安全的。任何与 mergeThread 函数内的 GUI 交互的东西都可能产生意想不到的结果。

请参阅我提供的链接以获取有关多线程 GTK 应用程序的更多信息,以了解如何改用 GDK。

【讨论】:

  • 感谢您的回答。是的,我已经使用此函数与其他线程上的 GTK 对象进行交互。 CreateThread 函数在主线程上调用。对于另一个线程,我只在控制台上显示一个文本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多