C++ 如何在C++;
我写了一个函数,它正在进行斐波那契计算。我想用CreateThread作为线程启动并执行它。最后,我想保存线程的结果(Fibonacci)并在控制台中显示它。我的代码有什么问题?它不能正常工作。它启动线程,但我不知道如何存储线程的结果并显示它C++ 如何在C++;,c++,windows,visual-studio,winapi,C++,Windows,Visual Studio,Winapi,我写了一个函数,它正在进行斐波那契计算。我想用CreateThread作为线程启动并执行它。最后,我想保存线程的结果(Fibonacci)并在控制台中显示它。我的代码有什么问题?它不能正常工作。它启动线程,但我不知道如何存储线程的结果并显示它 #include <Windows.h> #include <iostream> DWORD WINAPI Fibonacci(LPVOID arg_repeat) { DWORD dwValue = *(int*)arg
#include <Windows.h>
#include <iostream>
DWORD WINAPI Fibonacci(LPVOID arg_repeat) {
DWORD dwValue = *(int*)arg_repeat;
if (dwValue < 3)
return 1;
return Fibonacci((int*)dwValue - 1) + Fibonacci((int*)dwValue - 2);
}
auto main(int argc, const char* argv[]) -> decltype(0) {
DWORD dwFibonacciValue;
std::cout << "Fibonacci Value: ";
std::cin >> dwFibonacciValue;
DWORD dwThreadId;
HANDLE hThreading = CreateThread(NULL, 0, Fibonacci, &dwFibonacciValue, NULL, &dwThreadId);
WaitForSingleObject(hThreading, INFINITE);
std::cout << "Fibonacci Result: " << dwResult << std::endl;
CloseHandle(hThreading);
return 0;
}
#包括
#包括
DWORD WINAPI斐波那契(LPVOID arg_repeat){
DWORD dwValue=*(int*)arg_repeat;
如果(DWV值<3)
返回1;
返回Fibonacci((int*)dwValue-1)+Fibonacci((int*)dwValue-2;
}
自动main(int argc,const char*argv[])->decltype(0){
DWORD-dwfibonacci值;
std::cout>dwFibonacciValue;
德沃德·德维德;
HANDLE-hThreading=CreateThread(NULL、0、Fibonacci和dwFibonacciValue、NULL和dwThreadId);
WaitForSingleObject(hThreading,无限);
std::cout您的代码是错误的,因为(int*)dwValue-1
不是有效的指针
您应该将thread函数与fibonacci函数分开。可疑和错误的强制转换会少很多,代码也会更清晰:
#include <Windows.h>
#include <iostream>
// Clean and easy to read fibonacci function without fancy casts
DWORD Fibonacci(DWORD dwValue) {
if (dwValue < 3)
return 1;
return Fibonacci(dwValue - 1) + Fibonacci(dwValue - 2);
}
// Thread function
DWORD WINAPI Thread(LPVOID arg_repeat) {
return Fibonacci(*(DWORD*)arg_repeat); // the only cast int the whole code
}
int main(int argc, const char* argv[]) -> decltype(0) {
// it's 'int main', not 'auto main'
DWORD dwFibonacciValue;
std::cout << "Fibonacci Value: ";
std::cin >> dwFibonacciValue;
DWORD dwThreadId;
HANDLE hThreading = CreateThread(NULL, 0, Thread, &dwFibonacciValue, 0, &dwThreadId);
WaitForSingleObject(hThreading, INFINITE);
// get return value of the thread (your actual question)
DWORD dwResult;
GetExitCodeThread(hThreading, &dwResult);
std::cout << "Fibonacci Result: " << dwResult << std::endl;
CloseHandle(hThreading);
return 0;
}
应该是
CreateThread(NULL, 0, Thread, &dwFibonacciValue, 0, &dwThreadId);
在关闭其句柄之前,您需要等待,直到线程完成其工作并且没有通过调用WaitForSingleObject(hThreading,INFINITE)
退出main。请替换为“我的代码有什么问题?”有问题的描述;)。你必须知道比你写的更多的东西,否则你怎么知道有问题?我建议你仔细看看文档。你肯定误用了ResumeThread
的返回值。你需要等待线程完成,然后你需要获取线程的exi另外,传递给函数的参数是完全错误的。您认为(int*)怎么样dwValue-1
有什么作用?提示,不是你想的!你试图一下子学到太多东西。在尝试线程之前,你需要掌握基本知识。在尝试添加线程之前,试着让Fibonacci
在没有任何线程的情况下工作。不进行任何调试也是一个很大的错误。确保你精通使用调试似乎您将受益于std::future
()。它是解决您的问题的标准库答案,而不依赖windows API
CreateThread(NULL, 0, Thread, &dwFibonacciValue, 0, &dwThreadId);