在一CListCtrl 控件中同时选中多项进行下载(这个下载是个比较复杂的过程,是通过 CSerialPort类,最后通过消息把一个一个字符发送过来,比较慢),但我在多文件下载时,怎么分开两个下载的过程啊??
例如:
void CMainFrame::OnFileDownload() 
{   
    POSITION pos = rInfo->m_List_Gps.GetFirstSelectedItemPosition();
while (pos)
{
           iIndex = rInfo->m_List_Gps.GetNextSelectedItem(pos);
           FileDown.OnFileDownload(iIndex);
         }
这样做不行啊,因为OnFileDownload()最终是要发送一个命令(SendCommand)给串口类(CSerialPort),串口类再发回消息,不是直接完成的。这样势必就会导致第一个OnFileDownload还没响应完成,第二个OnFileDownload也同时在响应了,我不知怎么把他们区分开,大家帮我想想法子,谢谢!!尽量说详细点!!

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/3458/3458309.xml?temp=.8229334
    如果不用多线程,俺就不知道该咋弄了!
      

  2.   

    使用串口事件试试: 
      OVERLAPPED  os ; 
       DWORD       dwEvtMask,Errors;
       COMSTAT Stat;   memset( &os, 0, sizeof( OVERLAPPED ));
       os.hEvent = CreateEvent( NULL,    // no security
                                TRUE,    // explicit reset req
                               FALSE,   // initial event nonsignaled. 
                               NULL ) ; // no name
       dwEvtMask = 0 ;
       WaitCommEvent(idComDev,&dwEvtMask,&os);
       
       if (WaitForSingleObject(os.hEvent,MAXTIMEOUT)==WAIT_TIMEOUT)
       {
         CloseHandle(os.hEvent);
       return false;
       }
       else if ((dwEvtMask & EV_RXCHAR/*EV_RXFLAG*/) == /*EV_RXFLAG*/EV_RXCHAR)
       {
           CloseHandle(os.hEvent);
       
       //
       return true;
    }else
    {
         CloseHandle(os.hEvent);
       return false;
       }如果不行的话建议使用多线程
      

  3.   

    void CMainFrame::OnFileDownload() 
    {   
        POSITION pos = rInfo->m_List_Gps.GetFirstSelectedItemPosition();
        DWORD dwThreadID;    iIndex = rInfo->m_List_Gps.GetNextSelectedItem(pos);
        FThread=CreateThread(NULL,0,DisplayData,
    (LPVOID )&iIndex,CREATE_SUSPENDED,&dwThreadID);    ResumeThread(FThread);
    }DWORD WINAPI FileDown(LPVOID param)
    {

    while(TRUE)
    { FileDown.OnFileDownload(iIndex); //...FileDown if(...)//下载完成
    ExitThread(0); }
    return 0;
    }
      

  4.   

    编写断点续传和多线程下载模块http://www.cz88.net/2004/7-8/0153.htm
      

  5.   

    如果是多个线程(OnFileDownload和文件下载在不同的线程中)
    HANDLE hEvent = NULL;           //全局或者静态的
    hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    ......
    void CMainFrame::OnFileDownload() 
    {   
        POSITION pos = rInfo->m_List_Gps.GetFirstSelectedItemPosition();
    while (pos)
    {
               iIndex = rInfo->m_List_Gps.GetNextSelectedItem(pos);
               FileDown.OnFileDownload(iIndex);
               WaitForSingleObject(hEvent, INFINITE);
             }
    .......
    //在单个文件下载时完成的地方
     SetEvent(hEvent);
    如果是单个线程(OnFileDownload和文件下载在相同的线程中)
    BOOL volatile bFlag=FALSE;
    ......
    void CMainFrame::OnFileDownload() 
    {   
        POSITION pos = rInfo->m_List_Gps.GetFirstSelectedItemPosition();
    while (pos)
    {
               iIndex = rInfo->m_List_Gps.GetNextSelectedItem(pos);
               FileDown.OnFileDownload(iIndex);
               bFlag = TRUE;
               while( bFlag )
               {
                    Sleep(20);
               } 
             }
    .......
    //在单个文件下载时完成的地方
     bFlag = FALSE;
      

  6.   

    大哥们:看了大家的回复。首先很感谢大家,感谢csdn,真的。
    可能我说的不是太清楚,我在这把我的流程说一下:
    void CMainFrame::OnFileDownload() 
    {   
        POSITION pos = rInfo->m_List_Gps.GetFirstSelectedItemPosition();
        DWORD dwThreadID;
        iIndex = rInfo->m_List_Gps.GetNextSelectedItem(pos);
        lTob.lValue = Dir.m_pFileInfo[iIndex].lFileId ;
        for( int iN=0; iN<4; iN++ ) 
            m_szComArg[iN] = lTob.bBytes[iN] ;(m_szComArg是SendCommand()里要用到的一个变量,通过不同的iIndex 得到不同的m_szComArg)
            SendCommand( 5, 4 ) ;
        }
    SendCommand( 5, 4 ) 通过CSerialPort类最后发出消息。我就要写一个消息响应函数(OnCommunication())来接受这个消息,(每个字符发一次消息,发n次,我也要接n次)在OnCommunication())中每接受一个字符累计大小,当大小等于实际大小时,默认结束,此时将这以前收到的字符都写入文件。完成下载过程!
      

  7.   

    用单线程可以参考iicup(双杯献酒)的方法!
      

  8.   

    应该把FileDownload有关的东西放在线程函数里。
    而且,不太明白你为什么要用发消息的方式来传送数据,字符串可以压缩在消息里发送的呀
      

  9.   

    靠,不说清楚
    UINT WorkerThread(LPVOID pParam)
    {
        CMainFrame* pfrm = (CMainFrame*)pParam;
        POSITION pos = pfrm->rInfo->m_List_Gps.GetFirstSelectedItemPosition();
    while (pos)
    {
               WaitForSingleObject(pfrm->hEvent, INFINITE);
               iIndex = pfrm->rInfo->m_List_Gps.GetNextSelectedItem(pos);
               pfrm->OnFileDownload(iIndex);
             }  
    }
    HANDLE CMainFrame::hEvent = NULL;void CMainFrame::OnFileDownload() 
    {   
     // 创建事件
     hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
     // 事件置位
     SetEvent(hEvent);
     // 启动线程
     AfxBeginThread(WorkerThread, NULL);
    }
    OnCommunication()
    {
       //在文件接收完成的时候
       SetEvent(hEvent);
    }
    收工搞定