none
线程的执行后,影响类中的成员变量值改变 RRS feed

  • 问题

  • 我定义了一个CExecmd,类中的变量

    class CExecmd
    {
    // Construction
    public:
     CExecmd();
     static HANDLE m_hCom;     //串口句柄
        static CWinThread *m_pThread;    //线程句柄

    BOOL m_bUserNum;

    }

    线程函数

    UINT ComProc(LPVOID pParam)
    {
     DWORD lErrors;
     DWORD dwMask = 0, dwTrans = 0;
     COMSTAT comstat;
     CExecmd *pExecmd = (CExecmd *)pParam;
     OVERLAPPED ol; //ʼþÏß³ÌʹÓõÄ
     DWORD exitcode = 0;

     memset(&ol, 0, sizeof(OVERLAPPED));
     ol.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
     if(ol.hEvent == NULL)
     {
      AfxMessageBox("²»Äܽ¨Á¢Ê¼þ");
      return (UINT)-1;
     }

     DWORD dwRes = 0;
     while(m_gIsPortOpen)
     {
      WaitCommEvent(pExecmd->m_hCom, &dwMask, &ol);
      CString str;
      str.Format("comproc: %d ", GetLastError());
      TRACE(str);
      dwRes = WaitForSingleObject(ol.hEvent, INFINITE);
      switch(dwRes)
      {
      case WAIT_OBJECT_0:
       {
        switch(dwMask)
        {
        case EV_RXCHAR:
         {
          ClearCommError(pExecmd->m_hCom, &lErrors, &comstat);
          if(comstat.cbInQue != 0)
           pExecmd->OnProcessRead();
         }
         break;
        }
       }
       break;
      }
     }

     CloseHandle(ol.hEvent);
     ::GetExitCodeThread(pExecmd->m_pThread->m_hThread, &exitcode);
     AfxEndThread(exitcode);
     return 0;
    }

    打开串口以及开始线程函数(执行一次后就不再执行)

    BOOL CExecmd::OnOpenPort(CString comm)
    {
     DCB dcb;
     COMMTIMEOUTS time;
     
     if(!m_gIsPortOpen)
     { 
      m_hCom = CreateFile(comm, GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING,
       FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
      if (INVALID_HANDLE_VALUE == m_hCom)
      {
       m_gIsPortOpen = FALSE;
       return FALSE;
      }
     }

     //set the response event
     SetCommMask(m_hCom, EV_RXCHAR);
     //set the buffer of the read and write
     SetupComm(m_hCom, 1024, 1024);

     //Set time out
     time.ReadIntervalTimeout = 1000;
     time.ReadTotalTimeoutMultiplier = 1000;
     time.ReadTotalTimeoutConstant = 1000;
     time.WriteTotalTimeoutMultiplier = 1000;
     time.WriteTotalTimeoutConstant = 1000;
     SetCommTimeouts(m_hCom, &time);

     if (!GetCommState(m_hCom, &dcb))
     {
      AfxMessageBox("´®¿Ú״̬»ñȡʧ°Ü");
      return FALSE;
     }
     dcb.BaudRate = CBR_19200;
     dcb.ByteSize = 8;
     dcb.fBinary = TRUE;
     dcb.Parity = NOPARITY ;
     dcb.StopBits = ONESTOPBIT;
     dcb.fInX = TRUE;
     dcb.fOutX = TRUE;
     dcb.XonLim = 2048;
     dcb.XoffLim = 512;
     dcb.fNull = FALSE;

     //create worker thread
     if(SetCommState(m_hCom, &dcb))
     {
      m_pThread = AfxBeginThread(ComProc, (LPVOID)this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL);
      if(m_pThread == NULL)
      {
       CloseHandle(m_hCom);
       AfxMessageBox("Ï̴߳´½¨Ê§°Ü");
       m_gIsPortOpen = FALSE;
       return FALSE;
      }
      else
      {
       m_pThread->ResumeThread();
      }
     }
     m_gIsPortOpen = TRUE;

     return TRUE;
    }

    现在问题是,我的一个bool 变量aa,在执行线程前,赋值为1,执行之后,就是在ComProc执行后,这个值就变化为0了,我并没有在其他的位置给aa赋值啊,只有类的构造函数中和一个线程调用的函数中赋值为false,

     if(m_bUserNum)
     {
      m_nUserNum = m_nRet34; 
      m_bUserNum = FALSE;
     }

    在线程函数调用之前,都给它赋值为true但是跟踪的时候,就是看到这个变量的只改变了,好像还有其他的值也会改变。不知道什么原因,是不是线程都是这样的?

    2010年4月15日 6:06

答案

  • 八成是你有内存数组越界访问的地方,好好检查程序吧,检查你那个莫名其妙变化的变量的前面的变量是不是有越界访问。
    0xBAADF00D
    • 已标记为答案 Nancy Shao 2010年4月21日 5:53
    2010年4月15日 12:25
    版主