首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

毕竟哪个线程在睡眠

2013-12-10 
到底哪个线程在睡眠?事情是这样子的:用多线程来搞通信,于是催生了一个通信类,去芜存菁,模样如下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,我想知道现在睡眠的是主界面还是新线程?
[解决办法]
显然是新线程阿!你的主界面的线程还是自己做自己的事情在!
[解决办法]
主界面线程睡了的话,你的界面就卡住了.
[解决办法]
引用:
楼上说的都有道理,但是有点无法理解。线程函数作为类的成员函数时必须声明为static才行,而如果是static成员函数,就只能访问类的静态成员,为了调用本类的其他非静态成员,于是传了个this参数,然后就行了。这说明C++编译器在这方面没有对访问权限进行限制。说多了都是泪,为了完成相要的功能,我需要知道太多C++细节,然后我就抑郁了...

是的!
因为成员函数都有一个this对象指针,静态函数不属于某一个对象,而是整个类的!
其实我建议最好开线程的函数不需要作为成员函数的,一个简单的普通函数就好了!
通过普通函数传一个this指针过去,可以直接调用类中公共成员了!
[解决办法]
线程启动过程,不是简单的函数调用;

是操作系统,为你准备好运行环境(包括堆栈),是通过API函数,启动线程的。
启动过程,是把线程地址和参数以及其他信息,记录到操作系统的(包括当前进程的)一些数据结构中。

然后放到,就绪队列中,在线程调度时,启动的线程。

调用启动API函数的那个程序,只是完成了,线程信息的,录入工作。
在下一时刻,线程调度的过程中,才开始启动线程。

不是,立即停止当前线程,开始执行被启动线程的。




[解决办法]
所以睡眠的,是执行Run()的那个线程。就是工作者线程。
该线程执行
到 WorkerThreadProc后
进入WorkerThreadProc内部,执行Run(),然后开始睡眠。

热点排行