C++ 类内线程虚拟成员函数
我想做一个线程对象,成员函数“run”可以被重写。当我添加“虚拟”一词时,它将失败。有人能帮我吗?我如何制作线程对象。对象可以被继承,成员函数可以被重写C++ 类内线程虚拟成员函数,c++,multithreading,class,overriding,virtual-functions,C++,Multithreading,Class,Overriding,Virtual Functions,我想做一个线程对象,成员函数“run”可以被重写。当我添加“虚拟”一词时,它将失败。有人能帮我吗?我如何制作线程对象。对象可以被继承,成员函数可以被重写 #include <iostream> #include <process.h> using namespace std; class thread { private: static void gangplank(void *ptr) { ((thread *)ptr)->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;
}
#包括
#包括
使用名称空间std;
类线程
{
私人:
静态空隙跳板(空隙*ptr)
{
((线程*)ptr)->run();
}
公众:
void start()
{
_beginthread(&this->跳板,0,(void*)this);
//此->跳板((空*)此);
}
虚拟空运行()
{
我不知道这是不是你的问题,因为你只是说这是你的问题
失败,没有说明如何失败,但您不必等待线程停止
在main
中完成,因此您可能正在破坏线程对象
在线程开始运行之前。从析构函数中删除endthread
MSDN:
您可以显式调用_endthread或_endthreadex来终止
线程;但是,会自动调用_endthread或_endthreadex
当线程从作为参数传递给的例程返回时
_beginthread或_beginthreadex。通过调用endthread或_endthreadex终止线程有助于确保正确恢复资源
分配给线程的
好的,我现在明白了,_endthread在析构函数中,这里不是真正的问题,您必须在主函数中等待线程
#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;
}
#包括
#包括
使用名称空间std;
类线程
{
私人:
手柄m_手柄;
静态空隙跳板(空隙*ptr)
{
((线程*)ptr)->run();
}
公众:
HANDLE getHandle()常量{return m_HANDLE;}
void start()
{
m_handle=(handle)_beginthread(&this->gangplank,0,(void*)this);
}
虚拟空运行()
{
不能使用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();
}
#包括
#包括
无效运行()
{
std::cout当您说“它将运行失败”是什么意思?您会得到什么错误?错误消息是“text.exe已停止工作-Windows正在检查问题的解决方案”
#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();
}