到底哪个线程在睡眠?

时间:2022-10-05 17:31:09
事情是这样子的:用多线程来搞通信,于是催生了一个通信类,去芜存菁,模样如下

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,我想知道现在睡眠的是主界面还是新线程?

9 个解决方案

#1


显然是新线程阿!你的主界面的线程还是自己做自己的事情在!

#2


主界面线程睡了的话,你的界面就卡住了.

#3


lz大概是以为主线程在管理着新线程吧,新线程卡住了所以lz觉得主线程也卡住么?
2L是答案

#4


楼上说的都有道理,但是有点无法理解。线程函数作为类的成员函数时必须声明为static才行,而如果是static成员函数,就只能访问类的静态成员,为了调用本类的其他非静态成员,于是传了个this参数,然后就行了。这说明C++编译器在这方面没有对访问权限进行限制。说多了都是泪,为了完成相要的功能,我需要知道太多C++细节,然后我就抑郁了...

#5


引用 4 楼 shb8845369 的回复:
楼上说的都有道理,但是有点无法理解。线程函数作为类的成员函数时必须声明为static才行,而如果是static成员函数,就只能访问类的静态成员,为了调用本类的其他非静态成员,于是传了个this参数,然后就行了。这说明C++编译器在这方面没有对访问权限进行限制。说多了都是泪,为了完成相要的功能,我需要知道太多C++细节,然后我就抑郁了...

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

#6


线程启动过程,不是简单的函数调用;

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

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

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

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



#7


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

#8


同样是Sleep()函数,放到消息响应函数中如: OnLButtonDown()中,它就使界面线程睡眠,对于工作者线程,不管函数调用是否嵌套,它都使工作者线程睡眠。如果函数调用嵌套多了,我就不知道谁在睡眠......

#9


《Windows核心编程》

#1


显然是新线程阿!你的主界面的线程还是自己做自己的事情在!

#2


主界面线程睡了的话,你的界面就卡住了.

#3


lz大概是以为主线程在管理着新线程吧,新线程卡住了所以lz觉得主线程也卡住么?
2L是答案

#4


楼上说的都有道理,但是有点无法理解。线程函数作为类的成员函数时必须声明为static才行,而如果是static成员函数,就只能访问类的静态成员,为了调用本类的其他非静态成员,于是传了个this参数,然后就行了。这说明C++编译器在这方面没有对访问权限进行限制。说多了都是泪,为了完成相要的功能,我需要知道太多C++细节,然后我就抑郁了...

#5


引用 4 楼 shb8845369 的回复:
楼上说的都有道理,但是有点无法理解。线程函数作为类的成员函数时必须声明为static才行,而如果是static成员函数,就只能访问类的静态成员,为了调用本类的其他非静态成员,于是传了个this参数,然后就行了。这说明C++编译器在这方面没有对访问权限进行限制。说多了都是泪,为了完成相要的功能,我需要知道太多C++细节,然后我就抑郁了...

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

#6


线程启动过程,不是简单的函数调用;

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

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

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

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



#7


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

#8


同样是Sleep()函数,放到消息响应函数中如: OnLButtonDown()中,它就使界面线程睡眠,对于工作者线程,不管函数调用是否嵌套,它都使工作者线程睡眠。如果函数调用嵌套多了,我就不知道谁在睡眠......

#9


《Windows核心编程》