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是答案
2L是答案
#4
楼上说的都有道理,但是有点无法理解。线程函数作为类的成员函数时必须声明为static才行,而如果是static成员函数,就只能访问类的静态成员,为了调用本类的其他非静态成员,于是传了个this参数,然后就行了。这说明C++编译器在这方面没有对访问权限进行限制。说多了都是泪,为了完成相要的功能,我需要知道太多C++细节,然后我就抑郁了...
#5
是的!
因为成员函数都有一个this对象指针,静态函数不属于某一个对象,而是整个类的!
其实我建议最好开线程的函数不需要作为成员函数的,一个简单的普通函数就好了!
通过普通函数传一个this指针过去,可以直接调用类中公共成员了!
#6
线程启动过程,不是简单的函数调用;
是操作系统,为你准备好运行环境(包括堆栈),是通过API函数,启动线程的。
启动过程,是把线程地址和参数以及其他信息,记录到操作系统的(包括当前进程的)一些数据结构中。
然后放到,就绪队列中,在线程调度时,启动的线程。
调用启动API函数的那个程序,只是完成了,线程信息的,录入工作。
在下一时刻,线程调度的过程中,才开始启动线程。
不是,立即停止当前线程,开始执行被启动线程的。
是操作系统,为你准备好运行环境(包括堆栈),是通过API函数,启动线程的。
启动过程,是把线程地址和参数以及其他信息,记录到操作系统的(包括当前进程的)一些数据结构中。
然后放到,就绪队列中,在线程调度时,启动的线程。
调用启动API函数的那个程序,只是完成了,线程信息的,录入工作。
在下一时刻,线程调度的过程中,才开始启动线程。
不是,立即停止当前线程,开始执行被启动线程的。
#7
所以睡眠的,是执行Run()的那个线程。就是工作者线程。
该线程执行
到 WorkerThreadProc后
进入WorkerThreadProc内部,执行Run(),然后开始睡眠。
该线程执行
到 WorkerThreadProc后
进入WorkerThreadProc内部,执行Run(),然后开始睡眠。
#8
同样是Sleep()函数,放到消息响应函数中如: OnLButtonDown()中,它就使界面线程睡眠,对于工作者线程,不管函数调用是否嵌套,它都使工作者线程睡眠。如果函数调用嵌套多了,我就不知道谁在睡眠......
#9
《Windows核心编程》
#1
显然是新线程阿!你的主界面的线程还是自己做自己的事情在!
#2
主界面线程睡了的话,你的界面就卡住了.
#3
lz大概是以为主线程在管理着新线程吧,新线程卡住了所以lz觉得主线程也卡住么?
2L是答案
2L是答案
#4
楼上说的都有道理,但是有点无法理解。线程函数作为类的成员函数时必须声明为static才行,而如果是static成员函数,就只能访问类的静态成员,为了调用本类的其他非静态成员,于是传了个this参数,然后就行了。这说明C++编译器在这方面没有对访问权限进行限制。说多了都是泪,为了完成相要的功能,我需要知道太多C++细节,然后我就抑郁了...
#5
是的!
因为成员函数都有一个this对象指针,静态函数不属于某一个对象,而是整个类的!
其实我建议最好开线程的函数不需要作为成员函数的,一个简单的普通函数就好了!
通过普通函数传一个this指针过去,可以直接调用类中公共成员了!
#6
线程启动过程,不是简单的函数调用;
是操作系统,为你准备好运行环境(包括堆栈),是通过API函数,启动线程的。
启动过程,是把线程地址和参数以及其他信息,记录到操作系统的(包括当前进程的)一些数据结构中。
然后放到,就绪队列中,在线程调度时,启动的线程。
调用启动API函数的那个程序,只是完成了,线程信息的,录入工作。
在下一时刻,线程调度的过程中,才开始启动线程。
不是,立即停止当前线程,开始执行被启动线程的。
是操作系统,为你准备好运行环境(包括堆栈),是通过API函数,启动线程的。
启动过程,是把线程地址和参数以及其他信息,记录到操作系统的(包括当前进程的)一些数据结构中。
然后放到,就绪队列中,在线程调度时,启动的线程。
调用启动API函数的那个程序,只是完成了,线程信息的,录入工作。
在下一时刻,线程调度的过程中,才开始启动线程。
不是,立即停止当前线程,开始执行被启动线程的。
#7
所以睡眠的,是执行Run()的那个线程。就是工作者线程。
该线程执行
到 WorkerThreadProc后
进入WorkerThreadProc内部,执行Run(),然后开始睡眠。
该线程执行
到 WorkerThreadProc后
进入WorkerThreadProc内部,执行Run(),然后开始睡眠。
#8
同样是Sleep()函数,放到消息响应函数中如: OnLButtonDown()中,它就使界面线程睡眠,对于工作者线程,不管函数调用是否嵌套,它都使工作者线程睡眠。如果函数调用嵌套多了,我就不知道谁在睡眠......
#9
《Windows核心编程》