在一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也同时在响应了,我不知怎么把他们区分开,大家帮我想想法子,谢谢!!尽量说详细点!!
例如:
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也同时在响应了,我不知怎么把他们区分开,大家帮我想想法子,谢谢!!尽量说详细点!!
如果不用多线程,俺就不知道该咋弄了!
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;
}如果不行的话建议使用多线程
{
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;
}
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;
可能我说的不是太清楚,我在这把我的流程说一下:
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())中每接受一个字符累计大小,当大小等于实际大小时,默认结束,此时将这以前收到的字符都写入文件。完成下载过程!
而且,不太明白你为什么要用发消息的方式来传送数据,字符串可以压缩在消息里发送的呀
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);
}
收工搞定