ThreadPro.cpp
上传用户:bingyunhe
上传日期:2013-07-06
资源大小:723k
文件大小:2k
源码类别:

词法分析

开发平台:

Visual C++

  1. #include "stdafx.h" 
  2. #include "ThreadInfor.h"
  3. #include  <atltime.h>
  4.  UINT ThreadProc(LPVOID lpParam)
  5. {  
  6.    ThreadInfor * lpThreadInfor =  (ThreadInfor *) lpParam ;
  7.    TCHAR aChar[9][3] ={{'A','B','C'},{'D','E','F'},{'G','H','I'},
  8.  {'J','K','L'},{'M','N','O'},{'P','Q','R'},
  9.  {'S','T','U'},{'V','W','X'},{'Y','Z',' '}}; 
  10.   BtnMsg *pBtnMsg ;  
  11.   int nClickGap = 1000 ;  //击键在500毫秒之内为连续击键 
  12.   int nCharCount = 3 ; //字母的个数
  13.   
  14.  //  UINT nchar = 65 ; 
  15.    while (*lpThreadInfor->lpKillThread == FALSE )
  16.    {     
  17.        
  18.        
  19.    pBtnMsg = lpThreadInfor->pBtnMsg ; 
  20.    
  21.    
  22.    while(*(lpThreadInfor->lpLock) == TRUE )    
  23.    { 
  24.           //在循环时,表示等待解锁
  25.    } 
  26.      //跳出循环时,锁已经解开了
  27.    //他自己加锁
  28.         *(lpThreadInfor->lpLock) = TRUE  ;
  29.          
  30. POSITION pos = pBtnMsg->GetHeadPosition( ) ;
  31. int  nSendCount = 0 ; //发送的次数 
  32. while( pos != NULL )
  33.    {   
  34.            
  35.    CBtnMsg *  Btn = pBtnMsg->GetNext(pos ) ;
  36.    //当前位置
  37.           POSITION CuurPos = pos ; 
  38.   int nCount = 0 ; //连续击键次数
  39.           int nBtnPre = *(Btn->pBtnNo) ;  //前一次的按键序号
  40.   CFileTime ftPre  = *(Btn->pCurrTime) ;  //前一次的击键时间
  41.           while( CuurPos != NULL )
  42.   {    
  43.     
  44.                CBtnMsg *  tmpBtn = pBtnMsg->GetNext(CuurPos ) ; 
  45.    CFileTime ftCurr = *(tmpBtn ->pCurrTime) ; //本次的击键时间
  46.                int nBtnCurr =  *(tmpBtn ->pBtnNo) ; //当前按键序号 
  47.                CFileTimeSpan  tSpan = ftCurr - ftPre ;   // 击键间隔
  48.    if (( nBtnPre != nBtnCurr ) || (tSpan > nClickGap*CFileTime::Millisecond  ) )    
  49.    {   
  50.    pBtnMsg->GetPrev(CuurPos ) ; //回退一个步
  51.    break ; 
  52.               
  53.    }
  54.    else
  55.    {
  56.                   nCount++ ;
  57.                   nBtnPre = nBtnCurr ;
  58.                   ftPre = ftCurr ;
  59.                }
  60.   }
  61.            nCount = nCount % nCharCount ; 
  62.            
  63.            if ( (nSendCount == 0 ) || (CuurPos != NULL ) ) 
  64.    {
  65.             ::PostMessage(lpThreadInfor->hWnd , WM_KEYUP,aChar[nBtnPre-1][nCount] ,0) ;  
  66.                nSendCount++ ; 
  67.    }
  68.     for ( int i =0 ; i<= nCount ; i++ ) 
  69. {   
  70.         CBtnMsg * ptemp =  pBtnMsg->RemoveHead(  )  ;   // 
  71. if (ptemp != NULL ) 
  72. delete ptemp ;
  73. }
  74.           
  75.    pos = CuurPos ; //将 
  76.  // delete ptemp ; 
  77.    }
  78.     
  79.    //解锁
  80.  *(lpThreadInfor->lpLock) = FALSE  ;
  81.         ::Sleep(500) ;  
  82.    }
  83.   
  84.    return 0 ;