Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;_C++_Windows_Visual Studio_Winapi - Fatal编程技术网

C++ 如何在C++;

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

我写了一个函数,它正在进行斐波那契计算。我想用CreateThread作为线程启动并执行它。最后,我想保存线程的结果(Fibonacci)并在控制台中显示它。我的代码有什么问题?它不能正常工作。它启动线程,但我不知道如何存储线程的结果并显示它

#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);