我想在我的线程类中实现一个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); }
但是,这将使线程实例中包含的实际线程在指定的毫秒数内hibernate吗?
最好的问候,本杰明:)。
编辑:
所以按照atzz的说法,我可以将睡眠函数定义为一个静态成员函数,并且调用:: SleepEx(),这样我就可以这样调用它:
class test : RUNNABLE{ virtual void run(){ printf("hi"); thread::sleep(1000, false); } };
然后这会导致线程执行“testing”runnable睡眠1000毫秒?
它会睡觉, 无论哪个线程调用这个成员函数 。
不,这会使原来的线程睡眠,而不是你开始的线程。
是的,只要它是从该线程调用的(即从thread::run()
)中调用。 由于这个原因,我建议使sleep()
成为一个受保护的成员函数。
或者,作为一种替代方法,使其成为一种静态方法,用thread::sleep()
作为暂停调用线程的服务(在Java标准库中使用此方法thread::sleep()
语义。
除了调用线程睡眠以外,不可能做任何事情,因为当前线程可能处于中间。
如果您需要暂停新创建的线程,则应该使用SuspendThread
或将CREATE_SUSPENDED
传递给_beginthreadex()
,但在某些情况下会导致死锁
请参阅http://msdn.microsoft.com/en-us/library/ms686345%28v=VS.85%29.aspx