我试图在父类中声明一个静态类并初始化它,但我似乎遇到了各种各样的错误。
/* MainWindow.h */
class MainWindow
{
private:
static DWORD WINAPI threadproc(void* param);
static MainWindow *hWin;
};
/* MainWindow.cpp */
#include "MainWindow.h"
void MainWindow::on_pushButton_clicked()
{
HANDLE hThread = CreateThread(NULL, NULL, threadproc, (void*) this, NULL, NULL);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
}
DWORD WINAPI MainWindow::threadproc(void* param)
{
hWin = (MainWindow*) param;
//Be able to access stuff like hWin->run();
return 0;
}
我尝试过使用MainWindow::hWin = (MainWindow*) param;
和MainWindow::hWin = new MainWindow((MainWindow*) param));
以及其他许多人,但似乎都没有效果。这样做的正确方法是什么?有没有人会就这个问题推荐任何资源,我现在已经和class
问题纠缠了几天而且非常沮丧。
答案 0 :(得分:4)
答案 1 :(得分:0)
使用类似示例的静态变量不允许您拥有多个实例,因此最好尽可能避免使用它。在您的示例中,不需要使用一个,您可以轻松地使用局部变量。
只需从类定义中删除static MainWindow *hWin;
,然后修改MainWindow :: threadproc()以使用局部变量:
DWORD WINAPI MainWindow::threadproc(void* param)
{
MainWindow* const hWin = static_cast<MainWindow*>(param);
//hWin->whatever();
return 0;
}
但是,如果你真的想/必须使用一个静态变量(由于你的例子中不明显的原因),那么我建议在MainWindow的ctor中设置它 - 就在那里。无需将其显式传递给线程。
MainWindow::MainWindow()
{
assert(hWin == 0);
hWin = this;
}
MainWindow::~MainWindow()
{
assert(hWin == this);
hWin = 0;
}
void MainWindow::on_pushButton_clicked()
{
HANDLE hThread = CreateThread(0, 0, threadproc, 0, 0, 0);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
}
DWORD WINAPI MainWindow::threadproc(void*)
{
// just use hWin, it already points to the one and only MainWindow instance
return 0;
}