在类(窗口)中创建新线程
Create new thread in class (windows)
我想在类中创建一个新线程。问题是当我需要传递指向将在新线程中使用的函数的指针时。我无法传递指向该函数的指针。引擎盖下的类函数基本上是这个对吗?
void foo (this);
那为什么这段代码拒绝编译呢?
class TimeClass
{
private:
DWORD dwThreadId;
HANDLE hThread;
LPTHREAD_START_ROUTINE Timer ();
public:
TimeClass ();
};
TimeClass::TimeClass ()
{
dwThreadId = CreateThread (NULL, 0, Timer, this, 0, &dwThreadId);
}
线程函数的签名必须是
DWORD WINAPI ThreadProc(LPVOID param);
普通(即非静态)C++成员函数没有 WINAPI 调用约定,因此不能用作线程函数。如果将成员函数声明为静态,则可以将其用作线程函数:
static DWORD WINAPI ThreadProc(LPVOID param);
引擎盖下的类函数基本上是这个对吗?
虚空福(这个);
一般来说,没有。这是编译器决定的,可能有各种"非虚拟thunks",内联等。编译器可以以任何不改变程序行为的方式优化程序,并且此类实现细节未由标准定义。这就是为什么您要做的是UB,而您在这里的最佳选择(恕我直言)是这样的:
extern "C" wrapper(void * p)
{
static_cast<TimeClass*>(p)->whatever();
}
ThreadProc()
原型是
DWORD WINAPI ThreadProc(
_In_ LPVOID lpParameter
);
因此,您需要更改Timer()
声明,例如:
DWORD WINAPI Timer()
相关文章:
- 在挂钩启动新线程时解除挂钩进程
- 如何检查第三个 API 是否在 Linux 中为 c/c++ 程序创建了一个新线程?
- C++中的多线程:连接线程的正确方法
- 是否需要在 Timer.5 boost::asio 教程中运行新线程?
- SetTimer (带有回调函数)是否通过启动新线程来工作?
- Zmq 上下文 - 我应该在新线程中创建另一个上下文吗?
- 函数如何在不这样做的情况下在新线程上运行"as if"?
- 从 VS2013 到 VS2017 std::async 不会启动新线程
- 从传递给新线程C++的矢量中删除项目
- c++ 从成员函数创建新线程并移动对象和整个对象
- 在新线程C++中发送 http 请求
- 在新线程中访问移动的 std::string
- 使用新线程在类似于 Scott Meyer 的单例习惯用法的实现中实例化单例是否安全?
- Winapi:在类成员功能上创建新线程 - 不兼容的参数类型
- 使用新线程池而无需重新启动的新线程池后,Jemalloc的内存大大增加
- C++ std::async 不会生成新线程
- 如何在 Linux 上强制 g++ 在协程切换线程时更新线程指针(对于 TLS)
- 一旦另一个线程完成,就会生成一个新线程
- 只在前一个线程完成时创建一个新线程
- 创建新线程时在lambda内部使用unique_ptr的线程安全性