我想制作一个线程对象,可以覆盖成员函数“run”。当我添加“虚拟”这个词时,它会失败。有人可以帮助我 - 我怎样才能制作一个线程对象。该对象可以继承,并且可以覆盖成员函数。
#include <iostream>
#include <process.h>
using namespace std;
class thread
{
private:
static void gangplank(void *ptr)
{
((thread *)ptr)->run();
}
public:
void start()
{
_beginthread(&this->gangplank,0,(void *)this);
//this->gangplank((void *)this);
}
virtual void run()
{
cout<<1;
}
~thread()
{
_endthread();
}
};
class d:public thread
{
public:
void run()
{
cout<<2;
}
};
int main()
{
d a;
a.start();
return 0;
}
错误消息:
“text.exe已停止工作 - Windows正在检查问题的解决方案”
它没有编译错误。
答案 0 :(得分:1)
我不知道这是不是你的问题,因为你只是这么说
失败了,没有说怎么做,但你不等待线程
在main
中完成,因此您可能正在破坏线程对象
在线程开始运行之前。
答案 1 :(得分:0)
从析构函数中删除_endthread。
MSDN: 您可以显式调用_endthread或_endthreadex来终止 线;但是,_endthread或_endthreadex会自动调用 当线程从作为参数传递的例程返回时 _beginthread或_beginthreadex。通过调用endthread或_endthreadex来终止线程有助于确保正确恢复资源 为线程分配。
好的,我现在得到它,_endthread在析构函数中这不是真正的问题,你必须等待main函数中的线程。
#include <process.h>
#include <iostream>
using namespace std;
class thread
{
private:
HANDLE m_handle;
static void gangplank(void *ptr)
{
((thread *)ptr)->run();
}
public:
HANDLE getHandle() const {return m_handle;}
void start()
{
m_handle = (HANDLE)_beginthread(&this->gangplank,0,(void *)this);
}
virtual void run()
{
cout<<1;
}
~thread()
{
//_endthread();
}
};
class d:public thread
{
public:
void run()
{
cout<<2;
}
};
int main()
{
d a;
a.start();
WaitForSingleObject(a.getHandle(), INFINITE);
return 0;
}
答案 2 :(得分:0)
使用std::thread
代替原生C API。它使用函数对象,因此您甚至可能不需要虚函数。如果您的编译器不支持C ++ 11,那么您可以使用boost::thread
,它几乎相同(实际上,它直接使用本机API)。
以下是一个例子:
#include <thread>
#include <iostream>
void run()
{
std::cout << "run" << std::endl;
}
int main()
{
std::thread t(run);
t.join();
}
或者您也可以致电班级成员:
#include <thread>
#include <functional>
#include <iostream>
class A {
public:
void run()
{
std::cout << "run" << std::endl;
}
};
int main()
{
A a;
std::thread t(std::bind(&A::run, &a));
t.join();
}
通常建议尽可能使用更高级别的API,而不是自己创建C库调用的包装器。 C ++标准中的API(通常也在Boost中)通常比普通程序员更好地实现,并且它确实比自己实现良好的实现节省了大量时间。