基于MFC的多线程程序,要对三个USB设备(D1,D2,D3)进行读写。主窗口(CMainDlg)有3个按钮B1,B2,B3,分别操作设备D1,D2,D3,操作进度要在进度条P1,P2,P3上显示。按每个按钮,会分别启动对应的设备读写线程,并更新进度条。现在这样做的:
short g_curPos[3];   //全局变量,表示当前进度// MainDlg.cpp
void CMainDlg::OnBnClickedB1()
{
 short DeviceID = 0;
 AfxBeginThread( ThreadProc, &DeviceID, THREAD_PRIORITY_LOWEST );
}void CMainDlg::OnBnClickedB2()
{
 short DeviceID = 1;
 AfxBeginThread( ThreadProc, &DeviceID, THREAD_PRIORITY_LOWEST );
}void CMainDlg::OnBnClickedB3()
{
 short DeviceID = 2;
 AfxBeginThread( ThreadProc, &DeviceID, THREAD_PRIORITY_LOWEST );
}LRESULT CMainDlg::OnUpdateProg(WPARAM wState, LPARAM lPtr )
{
 short DeviceID = *(short *)lPtr;
 switch( wState )
 {
  case STATE_START:
   Progress[Device].SetRange( 0, 100 );
   Progress[Device].SetPos( g_curPos);
  break;
  case STATE_UPDATE:
   Progress[Device].SetPos( g_curPos );
  break;
  case STATE_END:
  break;
  default:
  break;
 }
}// Thread.cpp
UINT ThreadProc( LPVOID lpParam )
{
 int i;
 short DeviceID = *(short *)lpParam;
 
 for( i = 0; i < 100; i++ )
 {
  if( i == 0 )
  {
   g_curPos[DeviceID] = i;
   ::PostMessage( hMainWndHandle, WM_USER_UPDATE_PROGRESS, STATE_START, (LPARAM)&Device );  // 发送进度条初始化的消息
  }
  else
  {
   g_curPos[DeviceID] = i;
   ::PostMessage( hMainWndHandle, WM_USER_UPDATE_PROGRESS, STATE_UPDATE, (LPARAM)&Device ); // 发送进度条更新的消息
  }  readDevice[DeviceID];           // 读数据
 } ::PostMessage( hMainWndHandle, WM_USER_UPDATE_PROGRESS, STATE_END, (LPARAM)&Device );    // 发送结束消息
 
 AfxEndThread( 0, TRUE );
}现在的问题:
按按钮进度条可以正常更新,但是有时按B2,B3,更新也会更新到B1,不知道为什么?单步的时候发现有时按B2,B3时,ThreadProc获得的参数是0。

解决方案 »

  1.   

    DeviceID是局部变量,AfxBeginThread( ThreadProc, &DeviceID, THREAD_PRIORITY_LOWEST );
    这样有可能线程访问DeviceID的地址时,OnBnClickedB函数已经返回,DeviceID已经无效。DeviceID直接传值吧。
    AfxBeginThread( ThreadProc, DeviceID, THREAD_PRIORITY_LOWEST );short DeviceID = *(short *)lpParam;改为short DeviceID = (short)lpParam;
      

  2.   

    你的DeviceID 都是局部变量,线程函数访问的时候,数据可能已经释放,访问的数据根本不是你想的1,2,3
    要把DeviceID 作为全局变量.
      

  3.   

    &DeviceID
    (LPARAM)&Device你这些地方的传的地址都是局部变量的地址啊,超出作用域后这个地址就已经是不可控的了
    直接传值吧