C++ 如何从CreateThread()中加载的函数中获取返回值? 静态DWORD WINAPI PuneWather() { 浮子c1_温度=0.0; srand(rand()); c1_-temp=浮动(22.3+静态_-cast(rand()/静态_-cast(rand_-MAX/(30.1-22.3))); 返回c1_温度; } void cWeatherapdLG::OnBnClickedRunallBtn() { 处理城市1; city1=CreateThread(NULL,0,(LPTHREAD\u START\u例程)和cweatherapdlg::punewather,NULL,0,NULL); }

C++ 如何从CreateThread()中加载的函数中获取返回值? 静态DWORD WINAPI PuneWather() { 浮子c1_温度=0.0; srand(rand()); c1_-temp=浮动(22.3+静态_-cast(rand()/静态_-cast(rand_-MAX/(30.1-22.3))); 返回c1_温度; } void cWeatherapdLG::OnBnClickedRunallBtn() { 处理城市1; city1=CreateThread(NULL,0,(LPTHREAD\u START\u例程)和cweatherapdlg::punewather,NULL,0,NULL); },c++,multithreading,winapi,mfc,C++,Multithreading,Winapi,Mfc,从createthread()调用函数后,如何获取函数punewather返回的值?这可能吗 一周前我开始学习C++。请指出任何错误 使用静态变量并从线程分配值,然后从需要的位置访问它 static DWORD WINAPI puneWeather() { float c1_temp=0.0; srand(rand()); c1_temp = float(22.3+static_cast<float>(rand()/static_cast<float&g

createthread()
调用函数后,如何获取函数
punewather
返回的值?这可能吗


一周前我开始学习C++。请指出任何错误

使用静态变量并从线程分配值,然后从需要的位置访问它

static DWORD WINAPI puneWeather()
{
    float c1_temp=0.0;
    srand(rand());
    c1_temp = float(22.3+static_cast<float>(rand()/static_cast<float>(RAND_MAX/(30.1-22.3)))); 
    return c1_temp;
}

void CWeatherAppDlg::OnBnClickedRunallBtn()
{
    HANDLE city1;
    city1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&CWeatherAppDlg::puneWeather,NULL,0,NULL);
}
static float sResult;
静态DWORD WINAPI PuneWather()
{
浮子c1_温度=0.0;
srand(rand());
c1_-temp=浮动(22.3+静态_-cast(rand()/静态_-cast(rand_-MAX/(30.1-22.3)));
sResult=c1_温度;
返回0;
}
int main()
{
处理城市1;
city1=CreateThread(NULL,0,(LPTHREAD\u START\u例程)和punewather,NULL,0,NULL);
WaitForSingleObject(城市1,无限);
printf(“punewather返回%f\n”,sResult);
返回0;
}
的文档中说:

进程可以通过使用一个等待函数来确定它创建的线程何时完成。它还可以通过调用
GetExitCodeThread
函数来获取其
ThreadProc
的返回值

因此,可以调用
WaitForSingleObject
或其他一个等待函数来等待线程完成。一旦知道它已经完成,就可以调用
GetExitCodeThread
来获取线程过程的返回值

另请注意,的文档将此作为函数的签名:

static float sResult;
static DWORD WINAPI puneWeather()
    {
        float c1_temp = 0.0;
        srand(rand());
        c1_temp = float(22.3 + static_cast<float>(rand() / static_cast<float>(RAND_MAX / (30.1 - 22.3))));
        sResult  = c1_temp;
        return 0;
    }

    int main()
    {
        HANDLE city1;
        city1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&puneWeather, NULL, 0, NULL);
        WaitForSingleObject(city1, INFINITE);
        printf("puneWeather return %f \n", sResult);
        return 0;
    }
由于省略了
lpParameter
参数,您的函数没有此签名。因此,编译器会反对您传递带有错误签名的函数指针。您选择通过使用转换到
LPTHREAD\u START\u例程来抑制编译器错误,而不是更正签名

这是一个很坏的习惯。不要对编译器说这样的谎话。只需修复线程过程的声明:

DWORD WINAPI ThreadProc(
  _In_ LPVOID lpParameter
);

然后分配给
c1_temp
的右边的表达式看起来完全是假的。我真的不知道你想在那里实现什么,但可以肯定的是,这不是解决任何问题的办法

实际上,您希望线程返回值,但线程不是这样工作的。线程是异步的,它们可以占用任意数量的时间,这取决于它们正在做什么和完成什么。调用线程通常不会等待返回结果

在这种情况下,正确的选项是让线程将
PostMessage()
发送到主线程或主窗口,并在其具有可用结果时传递该值


您可以将主窗口的HWND和
PostMessage()
传递给此线程,以将结果传递回此窗口。

一个简单的替代方法是使用回调或设置全局变量。您需要告诉我们您实际尝试实现的目标。这里显示的代码毫无意义。在这里创建线程是完全没有意义的。阅读以下内容:Noob错误:强制转换函数指针会隐藏编译器错误,因为您的签名错误。当您计划从线程进程调用CRT时,不要使用
CreateThread
(您是)。改用
\u beginthreadex
。这两项都有明确的记录。下一个错误:忽略编译器警告。您正在截断一个
浮点
,将其填充到一个
DWORD
中。这不会有什么好结果。你需要停止猜测。在C++上读一些不错的书籍,阅读和理解它们。你用技术术语来做的是不可能的,但是如果你告诉我们你真正想要做的是返回值,那么也许有更好的方法。我会调查这件事的,有点蹩脚。想象一下,如果创建了两个这样的线程。您还可以将伪强制转换复制到
LPTHREAD\u START\u例程
。请注意,
punewather
具有错误的签名,而cast只是向编译器撒了一个大大的谎。您已经知道这一点,但可能不知道
WaitForSingleObject
将暂停UI线程,使UI看起来没有响应。要避免这种情况的常见模式是,在工作线程返回之前,将应用程序定义的(
WM_APP+x
)消息从工作线程发送到UI线程。在该消息的处理程序中,可以调用
WaitForSingleObject
,因为我们已经知道等待时间将非常短。@DavidHeffernan我们可以使用LPDWORD以外的任何其他类型的变量来保留退出代码吗?嗯,返回代码是一个DWORD。你不能改变这一点。
static DWORD WINAPI puneWeather(LPVOID lpParameter)