线程(Thread)的概念在一些以前的操作系统中是不存在的例如以前的UNIX和Windows3.X,线程与进程的区别在于子线程与父线程序运行在同一进程空间内,而子进程和父进程则运行在不同的空间。这样一来同一进程内的不同线程间可以直接通过内存交换数据(出于数据同步原因最好不要这样做)。
此外在Win32的定义中一个进程至少拥有一个线程,所以进程也被叫做主线程。在上一节中创建进程时大家也看见了可以在获得进程句柄时也可以获得一个线程句柄。在Win32中线程有两种,窗口线程(GUI Thread)和工作线程(Worker Thread)。窗口线程将可以创建窗口,因为创建窗口后系统会为该窗口分配消息队列,而不会为工作线程分配消息队列,所以工作线程将消耗更少的系统资源。
我们先看看如何创建线程。
在MFC中提供了对线程功能的封装类,CWinThread我们常使用的CWinApp类就是从这个类派生的。通常我们使用CWinThread来创建窗口线程,过程如下:
- 从CWinThread中派生新类。
- 重载CWinThread::InitInstance()函数,在其中创建窗口并将窗口指针赋给m_pMainWnd。
- 如果需要可以重载CWinThread::ExitInstance(),在窗口被销毁时该函数将会被调用。也就是说窗口线程的生命期是于窗口的生命器联系起来的。
下面是个简单的例子:
//线程类定义
class CGUIThread:public CWinThread
{
public:
CGUIThread();
virtual BOOL InitInstance(void);
virtual int ExitInstance(void);
};
CGUIThread::CGUIThread()
{
//设置自动删除
m_bAutoDelete = TRUE;
}
BOOL CGUIThread::InitInstance(void)
{
CWnd* pWnd= new
CWnd();pWnd->CreateEx(0,
AfxRegisterWndClass( CS_HREDRAW|CS_VREDRAW) ,
"gui thread window",
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
-
<script type="text/java script">BAIDU_CLB_fillSlot("771048");
-
点击复制链接 与好友分享!
回本站首页
<script>
function copyToClipBoard(){
var clipBoardContent=document.title + '\r\n' + document.location;
clipBoardContent+='\r\n';
window.clipboardData.setData("Text",clipBoardContent);
alert("恭喜您!复制成功");
}
<script type="text/java script" id="bdshare_js" data="type=tools&uid=12732">
<script type="text/java script" id="bdshell_js">
<script type="text/java script">
var bds_config = {'snsKey':{'tsina':'2386826374','tqq':'5e544a8fdea646c5a5f3967871346eb8'}};
document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js cdnversion=" + Math.ceil(new Date()/3600000)