     

     A 

     Microsoft Windows NT 3.51 (Service Pack 3)     
 (fibers).        Win32  
     UNIX  Windows NT.   
     Win32 ,   
    .  ,  
         
     .    , 
        
 . 
    ,       
UNIX-,   ,  ,  
,   ,   Windows.    Win32 
   ,       
      ,   ,  
    Windows. 
       UNIX-  Win32   .  
,      Windows    
 .  Windows   ,   
   ,      (   
      7).     
    ( 16). 
       (    )    Win32, 
Microsoft      .   
  API,     .  , 
   ,       , 
    .  ,  ,   
   . 
    -,   Windows      
,           
   Microsoft .      
   ,    User,      
,        , 
 .   ,        
       . 
    ,    ,         
.      ,       .  
         ,  
 (    ). 

    647 

    648 _____________________________Windows   

        ,     
  .    ConvertThreadToFiber. 

    LPVOID ConvertThreadToFiber(LPVOID IpParameter); 

          (  200 ).   
  : 
       32- ;    
 IpParameter,   ConvertThreadToFiber, 
         ; 
          ;     
     ; 
      ,     . 
        ,     
 ,   ,       . 
ConvertThreadToFiber  ,     
.     ,   ,    
             
 ,  .   ExitThread   
,  . 
         ,     
      .    
,  (    ),   CreateFiber. 

    LPVOID CreateFiber(DWORD dwStackSize, 
    LPFIBER_START_ROUTINE IpStartAddress, LPVOID IpParameter); 

         ,      
dwStackSize.   0,      
 1 ,     2  .   
  ,         
  . 
     , CreateFiber       
 .       ,  
   IpParameter,      
,      (   IpStartAddress). 
      ,  ,    : 

    VOID WINAPI FiberFunc(PVOID IpParameter); 

     ,     .   
   ,     
IpParameter  CreateFiber.       
.        VOID.    
,    ,   ,     
 !        ,    
      . 
      ConvertThreadToFiber, CreateFiber    
,    ,       , 
   .    
   . ,      ,  
 SwitchToFiber. VOID SwitchToFiber(LPVOID IpFlber); 
         (IpFiber)    
,     ConvertThreadToFiber  
CreateFiber.     ,    
 . SwitchToFiber   : 

    _________________________________  .  649 

    1.         
,     . 
    2.     ,    
,  .      ,   
        . 
    3.     ,    
 . 
    4.   .  ()   
  ,        . 
     SwitchToFiber      
 .          
 ,       
 . :         
 . ,     ,  
    .     
,    ,      
,         SwitchToFiber. 
      ,  DeleteFiber. 

    VOID DeleteFiber(LPVOID IpFiber); 

       ,      
IpFiber,  ,   ,    
. ,     ,      
, DeleteFiber   ExitThread       
    . 
    DeleteFiber   ,    .  
  ,    .   
       : ,  , 
  ,   ExitThread.     
TeminateThread           
.  ,        
    ,  ,     -. 
         ,  .  
      ,    
 ,      .    
  ,  GetCurrentFiber. 

    PVOID GetCurrentFiber(VOID); 

        GetFiberData: 

    PVOID GetFiberData(VOID); 

       ,      
 32- .     
IpParameter,   ConvertThreadToFiber  CreateFiber,  
   . GetFiberData    
       32- . 
       GetCurrentFiber  GetFiberData      
     (. .    
   ). 

    650 _____________________________Windows   


    - Counter 

     Counter (COUNTER. ) (.   . -1)  
     .  ,   
 ,  . (    
Counter;    ,         .) 

    Count to:   3              Answer:        - 
    Currently-running fiber:   User-interface 

         ,  
   .          
,    Count to ( ).    
        , 
   Answer ().     ,  
      Answer.    
    ,  ,    
 0,    ,    Count to. 
    ,     
 , ,      (User-interface) 
  (Recalculation)     . 
      ,      5   
 Recalculation,     Answer    0  5. 
  ,     ,   
.    50         
    .    ,    
,      ,   
      .  
  ,   ,        
    ,    . 
       .         
.     ,     
  .  ,   ,   
 . 
        ,        
,   ,  ,      
    .       
 Counter. 
           WinMain (.   
   . -1),   ConvertThreadToFiber, 
    (     
).      ,    
  .      
   (background processing state, BPS).  
   bps    g_FiberInfo.  3 : 

              

    BPS_DONE          ,     , 
   . 
    BPS_STARTOVER      ,     . 
    BPS_CONTINUE       ,    
,     . 

    ___________________________  .  651 

     bps      ,  
  .     . ,   
  (  ),   
.       . 
       , ,    
 (. .     bps  BPS_STARTOVER  
BPS_CONTINUE).      (BPS_DONE),  
,  WaitMessage,   ,    
,   . 
        ,     
    ,    (BPS_STARTOVER). 
,     ,  ,   ,  
 .        ,   
  .     ,  
 DeleteFiber.     .  ,  
,    ,      
 .     ,   , 
       ,  , 
     -   
  ,      . ,  
,   ,  ,      
   ,   bps  BPS_CONTINUE. 
       ,    - 
,    ,  SwitchToFiber.    
,        SwitchToFiber,  
     . 
    Counter_FiberFunc      ,  
 .      g_Fiber!nfo,  
     ,    
      . ,   
 ,        ,  
  ,      .  , 
    ,      
 ,       . 
    ,    ,    , , 
    .    , 
   ,   ,   0   
.      GetQueueStatus   
 ,         ( 
,     ,    ). 
   ,     ,  , 
      ,    
SwitchToFiber,      .  
 ( )  ,    
 ,   ,    . 
       ,     Answer  
    200 .      Sleep , 
,     ,    . 
     ,   ,   ,  
    BPS_DONE,    ( 
SwitchToFiber)  .      ,   
 WaitMessage,   ,    
  . 

    652 ______________________________Windows   


    COUNTER.C 
    /...,,,*,***,**,*,....******.;,*...**.*...*,***,*.***...*.***..*..,*. 
    : Counter. : Copyright  1996-1997,   (Jeffrey Richter) 
    #include ",.\CmnHdr.h" 
    #include <Windows.h> 
    ^include <WindowsX,h> 
    ffinclude <tchar.n> 
    ftinclude "Resource.h" 
    /////////////////////////////////////////////////////////////////////////////// 
    //     
    typedef enum { 
    BPS_STARTOVER,   //     
    BPSJ30NTINUE,    //    
    BPS_DONE        //     
    } BKGNDPROCSTATE; 
    typedef struct { 
    //    
    PVOID pFiberUI; 
    //    
    HWND hwnd; 
    //    
    BKGNDPROCSTATE bps: 
    } FIBERINFO. *PFIBERINFO; 
    //  ,     . 
    //      ,   ,  
    //   , - . 
    FIBERINFO g_Fiber!nfo; 
    lllll/ll///i/////ll//l/lillllH//ll/lll/l!ll/l/l//lll/l/IIIIIIIIIIH/llllll/lll 
    void WINAPI Counter_FiberFLinc (LPVOIO pvParam) { 
    PFIBERINFO pFiberInfo = (PFIBERINFO) pvParain; 
    BOOL rTranslated; 
    int x, nCount; 
    
    //   ,     
    SetDlgItemText(pFiberInfo->hwnd, IDC_FIBER, __TEXT("Recalculation")); 
    
    //       
    nCount = GetDlgItemInt( 
    pFiberInfo->hwnd, IDC_GOUNT, SfTranslated, FALSE); 

    . . . 

    . -1.   Counter 

    ______________________________  .  653 


    . -1   () 
    
    I/   0  nCount,     
    for ( = 0;  <= nCount: ++) { 
    
    //      
    // (   ,  ) 
    if (HIWORD(GetQueueStatus(QS_ALLEVENTS)) != 0) { 
    
    //   - .   
    //      . 
    SwitchToFiber(pFiberInfo->pFiberUI); 
    
    //   ,   
    SetDlgItemText(pFiberInfo->hwnd, IDC_FIBER, __TEXT("Recalculation")): 
    
    //    , 
    //     
    SetDlgItefflInt(pFiberInfo->hwnd, IDC_ANSWER, x, FALSE); 
    // ,  "" ; 
    //     Sleep   
    81(200); 
    \ 
    
    // ,    
    pFiberInfo->bps = BPS_DONE; 
    
    //     .  
    // ,  , ,  . 
    // :      , 
    //     ,     ! 
    SwitchToFiber(pFiberInfo->pFiberUI); 
    i 
    J 11/11111111111111111111111111/1111111111111111111111111111111111111111111111111 
    BOOL Counter_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM IParam) { 
    //      
    chSETDLGICONS(hwnd, IDI_COUNTER, IDI_COUNTER); 
    ftifdef _DEBUG 
    
    //         
    //  ,     
    SetWindowPos(hwnd, NULL, , , , , SWP_NOZORDER ; SWP_NOSIZE); 
    ffendif 


    654 __ __________________________ Windows   


    . ~1   () 

    SetDlgItemInt(hwnd, IDC_COUNT, , FALSE); 
    return(TRUE): 
    void Counter_OnComniand(HWND hwnd, int id. HWND hwndCtI, UINT codeNotify) { 
    switch (id) { 
    case IDCANCEL: 
    
    //    Esc,   
    //      
    DestroyWindow(hwnd); 
    break: 
    case IDC_COUNT: 
    if (codeNotify == EN_CHANGE) { 
    //    , 
    //     
    g_FiberInfo.bps = BPS_STARTOVER; 
    } 
    break; 
    
    BOOL WINAPI Counter_DigProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM 
IParam) { 
    switch (uMsg) { 
    HANDLE_MSG(hwnd, WM_INITDIALOG, Counter_OnInitDialog); 
    HANDLE_MSG(hwnd, WM_COMMAND, Counter_OnCommand); 
    } 
    return(FALSE); 
    i 
    /////////////////////////////////////////////////////////////////////////////// 
    int WINAPI _tWinMain (HINSTANCE hinstExe, 
    HINSTANCE hinstPrev, LPTSTR pszCmdLine, int nCmdShow) { 
    //  ,    
    PVOID pFiberCounter = NULL; 
    chWARNIFUNICODEUNDERWIN95(); 
    //     
    g_FiberInfo,pFiberUI = ConvertThreadToFiber(NULL); 
    //    

    . . . 

    ________________________________ .  655 


    . -1   () 

    g_FiberInfo.hwnd = CreateDialog(hinstExe, 
    MAKEINTRESOURCE(IDD_COUNTER), NULL, Counter_DlgProc); 
    //  , ,   
    //     
    SetDlgIteniText(g_FiberInfo.hwnd, IDC_FIBER, __TEXT("User-interface")); 
    
    //     
    g_FiberInfo.bps = BPS_DONE: 
    
    //    ,.. 
    while (IsWindow(g_FiberInfo.hwnd)) { 
    
    //    
    //   
    MSG msg; 
    if (PeekMessage(&msg, NULL. , 0, PM_REMOVE)) { 
    
    //     ,   
    if (!IsOialogMessage(g_FiberInfo.hwnd, &msg)) { 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
    \ i 
    } else { 
    
    //   ,   
    //   
    switch (g_FiberInfo.bps) { 
    case BPS_DONE: 
    //   ,     ; 
    //  ,     
    WaitMessageO; 
    break; 
    case BPS_STARTOVER: 
    
    //   , 
    //     
    if (pFiberCounLer != NULL) { 
    
    //  ,   ,  , 
    //  ,      
    DeleteFiber(pFiberCounter); 
    pFiberCounter = NULL; 
    i i 

    . . cur, 

    656 _____________________________Windows   


    . -1   () 

    II     ,  
    //     
    pFiberCounter = CreateFiber(0, Counter_FiberFunc, &g_FiberInfo); 
    //   ,    
    g_Fiber!nfo.bps = BPS_CONTINUE; 
    //   BPS_CONTINUE... 
    case BPS_CONTINUE: 
    //    ... 
    SwitchToFlber(pFiberCounter); 
    
    //    -  
    //      
    // ,    
    
    //  , ,   
    //     
    SetDlgItemText(g_FiberInro.hwnd, 
    IDC_FIBER, __TEXT("User-interface")): 
    if (g_FiberInfo.bps == BPS_DONE) { 
    
    //    ,  
    //  ,      
    //    
    OeleteFiber(pFiberCounter); 
    pFiberCounter = NULL; 
    } 
    break; 
    } //   switch 
    } //      
    } // while ( ) 
    return(O): //   
    1 
    //////////////////////////////////   ///////////////////////////////// 