我想在我的线程类中实现一个sleep()函数,但我不知道这是否是一种有效/正确的方法。 这是我的整个线程类(thread.h):
#include <process.h>
struct RUNNABLE{
virtual void run() = 0;
};
class thread{
public:
void start(void *ptr){
DWORD thr_id;
HANDLE thr_handl = (HANDLE)_beginthreadex(NULL, 0, thread_proc, ptr, 0, (unsigned int*)&thr_id);
}
void sleep(int sleep_time, bool alertable){
SleepEx(sleep_time, alertable);
}
private:
static unsigned int __stdcall thread_proc(void *param){
((RUNNABLE*)param)->run();
_endthreadex(0);
return 0;
}
};
因为你可能能够理清,这是我的sleep()函数:
void sleep(int sleep_time, bool alertable){
SleepEx(sleep_time, alertable);
}
但是这会使这个线程实例中包含的实际线程睡眠指定的毫秒数吗?
祝你好运, 本杰明:)。
编辑:
所以根据atzz的说法,我可以将sleep函数定义为静态成员函数,并调用:: SleepEx(),这样我就可以这样调用它:
class test : RUNNABLE{
virtual void run(){
printf("hi");
thread::sleep(1000, false);
}
};
然后那会导致执行'test'的线程runnable睡眠1000毫秒吗?
答案 0 :(得分:2)
无论哪个线程调用此成员函数 ,它都会进入 。
答案 1 :(得分:1)
不,这会让原始线程进入休眠状态,而不是你开始的线程。
答案 2 :(得分:0)
是的,只要它从该线程调用(即从thread::run()
内)。
因此,我建议将sleep()
作为受保护的成员函数。
或者,作为替代方案,使其成为一个静态方法,语义thread::sleep()
是暂停调用线程的服务(例如,在Java标准库中使用此方法)。
除了调用线程休眠之外,不可能做其他事情,因为线程可以在那个时刻处于某事的中间。
答案 3 :(得分:0)
如果您需要暂停新创建的主题,则应使用SuspendThread
代替CREATE_SUSPENDED
或_beginthreadex()
{{1}},但在某些情况下会导致死锁
请参阅http://msdn.microsoft.com/en-us/library/ms686345%28v=VS.85%29.aspx