windows核心编程,纤程使用
Microsoft公司给Windows添加了一种纤程,以便能够非常容易地将现有的 UNIX服务器应用程序移植到Windows中。UNIX服务器应用程序属于单线程应用程序(由Windows定义),但是它能够为多个客户程序提供服务。换句话说,UNIX应用程序的开发人员已经创建了他们自己的线程结构库,他们能够使用这种线程结构库来仿真纯线程。该线程包能够创建多个堆栈保存某些CPU寄存器,并且在它们之间进行切换,以便为客户机请求提供服务。显然,若要取得最佳的性能,这些 UNIX应用程序必须重新设计,仿真的线程库应该用Windows提供的纯线程来替代。然而,这种重新设计需要花费数月甚至更长的时间才能完成因此许多公司首先将它们现有的 UNIX代码移植到Windows中,这样就能够将某些应用软件推
向Windows市场。当你将UNIX代码移植到Windows中时,一些问题就会因此而产生。尤其是 Windows管理线程的内存栈的方法要比简单地分配内存复杂得多。 Windows内存栈开始时的物理存储器的容量比较小,然后根据需要逐步扩大。这个过程在第 16章“线程的堆栈”中详细介绍。由于结构化异常处理机制的原因,代码的移植就更加复杂了。
为了能够更快和更正确地将它们的代码移植到 Windows中,Microsoft公司在操作系统中添加了纤程。本章将要介绍纤程的概念、负责操作纤程的函数以及如何利用纤程的特性。要记住如果有设计得更好的使用Windows自身线程的应用程序,那么应该避免使用纤程。
文章目录
/*
12_Counter.cpp
纤程使用的
*/
#include "..\CommonFiles\CmnHdr.h" /* See Appendix A. */
#include <WindowsX.h>
#include <tchar.h>
#include "Resource.h"
#include <StrSafe.h>
/
//后台处理过程可能的状态
typedef enum
{
BPS_STARTOVER, //重新开始后台处理过程
BPS_CONTINUE, //继续后台处理过程
BPS_DONE //后台处理结束
}BKGNDPROCSTATE;
typedef struct
{
PVOID pFiberUI; //用户纤程对象(上下文)
HWND hwnd; //UI窗口句柄
BKGNDPROCSTATE bps;//后台处理过程的状态
}FIBERINFO,*PFIBERINFO;
//全局变量
//用用程序运行章台,改变了可以由UI纤程直接访问,后台处理程序可间间访问
FIBERINFO g_FiberInfo;
//纤程局部存储索引FLS槽
DWORD g_dwSlot = 0;
/
VOID WINAPI LogMessage(PVOID pFlsValue);//FlsAlloc中指定的回调函数
void WINAPI FiberFunc(LPVOID lpParamter);
BOOL Dlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam);
void Dlg_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);
INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
/
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PTSTR pszCmdLine, int)
{
//后台处理的纤程对象
PVOID pFiberCounter = NULL;
//主线程转为主线程
g_FiberInfo.pFiberUI = ConvertThreadToFiber(NULL);
//如果FLS插槽正在使用中,则在删除线程,线程退出已经释放FLS所有时调用FLS
g_dwSlot = FlsAlloc(LogMessage);//FLS索引时调用FlsCallback
FlsSetValue(g_dwSlot, (