多線程圖片下載程序的修改心得.

多線程圖片下載程序的修改過程.
1.在void CThreadURLDlg::OnSave()裏共產生16個線程:
 for (int i=0; i<isel; i++)
 {
  m_param.strPath=sFilePath+"//"+strFileName.GetAt(i);
  m_param.strURL=m_list.GetItemText(i,1);
  m_param.hwnd=this->m_hWnd;//原始程序未初始化!
  CWinThread* pThread = AfxBeginThread(SearchUrlThread,&m_param,THREAD_PRIORITY_NORMAL);
  Sleep(10);//
  //afxDump<< m_param.strURL<<"..."<<"/n";
 }
Sleep(10)一句非常重要,這條語句的意思是叫當前線程睡眠10毫秒,其實質是讓新產生的線程有運行時間.否則新產生線程的參數可能不對,
現象是strURL的值會重複,不但導致少下載一個或幾個,還會在寫文件時出現共享錯誤.
在沒有Sleep()的時候,由於文件名會重複一次或幾次,多線程共用函數SearchUrlThread(LPVOID pParam)中
CFile outFile (strFile, CFile::modeCreate|CFile::modeReadWrite);必須添加CFile::shareDenyNone,否則共享衝突.也就是有一個以上的
線程在寫同一個文件.
附帶的是OnSave()裏條件判斷值不對(i<isel-1),少產生一個線程.
2.內存泄漏問題嚴重,需要通過 delete HttpSendState; 及delete myHttpFile;解決
3.MYTHRURL m_param中的成員hwnd沒初始化,見上.
typedef struct THRURL 
{
 CString strURL;
 CString strPath;
 HWND hwnd;
}MYTHRURL;

4.SearchUrlThread()
UINT SearchUrlThread(LPVOID pParam)
{
 MYTHRURL *m_pParam=(MYTHRURL*)pParam;//!
 CString url=m_pParam->strURL;        //!
 CString path=m_pParam->strPath;      //!
  ....
}
以上3句打'!'的語句有特殊意義,不能直接用人口參數pParam,必須在棧內產生臨時變量,以便線程切換時能保持正確的參數.
否則16個線程的參數會變成最後產生的線程的參數.使的只下載一個文件!

發佈了32 篇原創文章 · 獲贊 10 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章