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)