我想做这段简单的代码。

#include <iostream>
#include <windows.h>


    void printSome (int i)
    {
        std::cout << i << std::endl;
    }

    void spawnThread (void (*threadName)(int i))
    {
        CreateThread
            (
                0,      // default security attributes
                0,          // use default stack size
                (LPTHREAD_START_ROUTINE)threadName,  // thread function name
                (LPVOID)i,          // argument to thread function
                0,          // use default creation flags
                0       // returns the thread identifier
            );
    }

    int main ()
    {
        spawnThread(printSome(155));
    }

我在Windows上,使用vs。任何帮助将不胜枚举。

最佳答案

就我个人而言,我不会考虑传递函数指针,就像您试图像C++一样。那就是用C++编码C

相反,我会将其包装在一个类中。这样做的最大好处是,您可以覆盖该类以拥有所需的许多成员,而不必每次执行怪异的转换技巧来获取您的参数。

该代码有点冗长,所以我将其推到最后。但是它可以让您执行以下操作:

   class print_some : public basic_thread {
    private:
       int i;
    public:
       print_some (int i) : i(i) {};
       action_callback () {
          std::cout << i << std::endl;
       }
    }
    int main () {
       print_some printer (155);
    }

这是我们的一个类中执行此操作的示例代码:
class basic_thread :
{
public:
   basic_thread();
protected:
   unsigned long m_ThreadId;

   virtual void action_callback () {};

   // Internal routine used to bridge between OS callback format and
   // action_callback. *Must* be static for the OS.
   static unsigned long __stdcall self_calling_callback (void *parameter);
}

...在.cpp文件中:
unsigned long __stdcall basic_thread::self_calling_callback (void *parameter) {
   if (parameter) {
      basic_thread * thread = reinterpret_cast<basic_thread *>(parameter);
      thread->action_callback();
   }
   return 0; // The value returned only matters if someone starts calling GetExitCodeThread
             // to retrieve it.
}

basic_thread::basic_thread () {
   // Start thread.
   m_Handle = CreateThread(NULL,
                           0,
                           self_calling_callback,
                           (PVOID)this,
                           0,
                           &m_ThreadId );
   if( !IsHandleValid() )
      throw StartException("CreateThread() failed", GetLastError());

}

08-27 17:40