毕竟哪个线程在睡眠
到底哪个线程在睡眠?事情是这样子的:用多线程来搞通信,于是催生了一个通信类,去芜存菁,模样如下class CNet
到底哪个线程在睡眠?
事情是这样子的:用多线程来搞通信,于是催生了一个通信类,去芜存菁,模样如下
class CNetConn
{
public:
virtual void Run();
private:
static DWORD WINAPI WorkerThreadProc(LPVOID lpParam);
};
void CNetConn::Run()
{
SleepEx(100,TRUE);
}
DWORD WINAPI CNetConn::WorkerThreadProc(LPVOID lpParam)
{
CNetConn* pThis = reinterpret_cast<CNetConn*>( lpParam );
_ASSERTE( pThis != NULL );
pThis->Run();
return 1L;
}
现在我在界面主线程CreateThread()一个新的线程,线程的函数体就是WorkerThreadProc,我想知道现在睡眠的是主界面还是新线程?
[解决办法]显然是新线程阿!你的主界面的线程还是自己做自己的事情在!
[解决办法]主界面线程睡了的话,你的界面就卡住了.
[解决办法]是的!
因为成员函数都有一个this对象指针,静态函数不属于某一个对象,而是整个类的!
其实我建议最好开线程的函数不需要作为成员函数的,一个简单的普通函数就好了!
通过普通函数传一个this指针过去,可以直接调用类中公共成员了!
[解决办法]线程启动过程,不是简单的函数调用;
是操作系统,为你准备好运行环境(包括堆栈),是通过API函数,启动线程的。
启动过程,是把线程地址和参数以及其他信息,记录到操作系统的(包括当前进程的)一些数据结构中。
然后放到,就绪队列中,在线程调度时,启动的线程。
调用启动API函数的那个程序,只是完成了,线程信息的,录入工作。
在下一时刻,线程调度的过程中,才开始启动线程。
不是,立即停止当前线程,开始执行被启动线程的。
[解决办法]所以睡眠的,是执行Run()的那个线程。就是工作者线程。
该线程执行
到 WorkerThreadProc后
进入WorkerThreadProc内部,执行Run(),然后开始睡眠。