VC++深入詳解視頻勘誤和說明_第1頁
VC++深入詳解視頻勘誤和說明_第2頁
VC++深入詳解視頻勘誤和說明_第3頁
VC++深入詳解視頻勘誤和說明_第4頁
VC++深入詳解視頻勘誤和說明_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、一、在視頻Lesson2中,在介紹構(gòu)造函數(shù)時,我說:“構(gòu)造函數(shù)最重要的作用是創(chuàng)建對象本身,對象內(nèi)存的分配由構(gòu)造函數(shù)來完成的”,這句話是錯的,對象內(nèi)存的分配和構(gòu)造函數(shù)沒有關(guān)系,對象內(nèi)存的分配是由編譯器來完成的,構(gòu)造函數(shù)的作用是對對象本身做初始化工作,也就是給用戶提供初始化類中成員變量的一種方式,在類對象有虛表的情況下,構(gòu)造函數(shù)還對虛表進行初始化。另外,我說:“C+又規(guī)定,如果一個類沒有提供任何的構(gòu)造函數(shù),則C+提供一個默認的構(gòu)造函數(shù)(由C+編譯器提供)”,這句話也是錯誤的,正確的是:如果一個類中沒有定義任何的構(gòu)造函數(shù),那么編譯器只有在以下三種情況,才會提供默認的構(gòu)造函數(shù):1、如果類有虛擬成員函數(shù)

2、或者虛擬繼承父類(即有虛擬基類)時;2、如果類的基類有構(gòu)造函數(shù)(可以是用戶定義的構(gòu)造函數(shù),或編譯器提供的默認構(gòu)造函數(shù));3、在類中的所有非靜態(tài)的對象數(shù)據(jù)成員,它們對應的類中有構(gòu)造函數(shù)(可以是用戶定義的構(gòu)造函數(shù),或編譯器提供的默認構(gòu)造函數(shù))。二、在視頻 Lesson4 的Code 中,畫扇形用如下代碼即可:if(m_bDraw = TRUE)  dc.MoveTo(m_ptOrigin);  dc.LineTo(point);帶邊線的扇形用如下代碼即可:if(m_bDraw = TRUE)  dc.MoveTo(m_ptOrigin);

3、  dc.LineTo(point);  dc.LineTo(m_ptOld);  m_ptOld = point;三、關(guān)于在對話框上放置組合框的問題,我說“如果拖動的矩形較小,組合框的列表框部分將無法顯示,此時也無法調(diào)整組合框的上下位置的大小了”。實際上,組合框的上下位置還是可以調(diào)整的,調(diào)整的辦法如下:在對話框資源處于編輯狀態(tài)時,將鼠標移動到組合框控件右邊向下的箭頭上,當鼠標變成上下箭頭形狀時,單擊鼠標左鍵,此時可以看到舉行框圍繞著組合框。將鼠標移動到該矩形框下端的藍色小方塊上,當鼠標變成上下箭頭形狀時,按住鼠標左鍵向下拖動,直到把

4、組合框的下拉列表框范圍拖動到合適的大小時松開鼠標左鍵。四、在視頻Lesson16的事件代碼中,有一個問題,修改如下:void main()HANDLE hThread1;HANDLE hThread2;g_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL); /將CreateEvent()函數(shù)放置在這個位置hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);CloseHandle(hThread1);CloseH

5、andle(hThread2);/g_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);/取消這個位置的CreateEvent()函數(shù)。/*g_hEvent=CreateEvent(NULL,FALSE,FALSE,"tickets");if(g_hEvent)  if(ERROR_ALREADY_EXISTS=GetLastError()     cout<<"only instance can run!"<<endl; &#

6、160; return;  */SetEvent(g_hEvent);Sleep(4000);CloseHandle(g_hEvent);原因:如果在線程產(chǎn)生之后調(diào)用CreateEvent(),假如線程提前被操作系統(tǒng)調(diào)度,那么線程里的 WaitForSingleObject 等待的將是一個空的g_hEvent, 在這種情況下,WaitForSingleObject 將返回WAIT_FAILED 。這個問題可以通過在CreateEvent()函數(shù)前添加Sleep(10)的調(diào)用來查看。五、在視頻Lesson16的采用事件的多線程同步代碼中,有一個問題:在線程1和線程2的代碼中,

7、有下面一段:while(TRUE)  WaitForSingleObject(g_hEvent,INFINITE);  if(tickets>0)     Sleep(1);   cout<<"thread1 sell ticket : "<<tickets-<<endl;    else   break;  SetEvent(g_hEvent);這個代碼

8、有一個問題,當線程1或線程2賣完最后一張票時,調(diào)用SetEvent(g_hEvent);將事件對象設(shè)置為有信號狀態(tài),另一個線程等待到事件對象,開始執(zhí)行代碼,判斷tickets不大于0,于是執(zhí)行else語句下的break,退出循環(huán),此時SetEvent(g_hEvent);就沒有被執(zhí)行,導致線程1或線程2一直等待,直到主線程終止運行,整個程序才退出。應將SetEvent(g_hEvent);在 if 和 else 中分別調(diào)用,修改如下:DWORD WINAPI Fun1Proc(  LPVOID lpParameter   / thread data)wh

9、ile(TRUE)  WaitForSingleObject(g_hEvent,INFINITE);/  ResetEvent(g_hEvent);  if(tickets>0)     Sleep(1);   cout<<"thread1 sell ticket : "<<tickets-<<endl;   SetEvent(g_hEvent);    

10、else     SetEvent(g_hEvent);   break;  return 0;DWORD WINAPI Fun2Proc(  LPVOID lpParameter   / thread data)while(TRUE)  WaitForSingleObject(g_hEvent,INFINITE);/  ResetEvent(g_hEvent);  if(tickets>0) 

11、60;   Sleep(1);   cout<<"thread2 sell ticket : "<<tickets-<<endl;   SetEvent(g_hEvent);    else     SetEvent(g_hEvent);   break;  return 0;六、在視頻Lesson16的采用關(guān)鍵代碼段的多線程同步代碼中,有一個問題:在視頻講解過

12、程中,在線程1和線程2的代碼中,有下面一段:while(TRUE)  EnterCriticalSection(&g_cs);  Sleep(1);  if(tickets>0)     Sleep(1);   cout<<"thread1 sell ticket : "<<tickets-<<endl;    else   break; 

13、; LeaveCriticalSection(&g_cs);這個代碼有一個問題,當線程1或線程2賣完最后一張票時,釋放對臨界區(qū)對象的所有權(quán)后,另外一個線程進入關(guān)鍵代碼段,判斷tickets不大于0,執(zhí)行else語句下的break,退出循環(huán),于是LeaveCriticalSection(&g_cs);就沒有執(zhí)行,導致線程1或線程2一直等待,直到主線程終止運行,整個程序才退出。應將LeaveCriticalSection(&g_cs);在 if 和 else 中分別調(diào)用,修改如下:DWORD WINAPI Fun1Proc(  LPVOID l

14、pParameter   / thread data)while(TRUE)  EnterCriticalSection(&g_cs);  Sleep(1);  if(tickets>0)     Sleep(1);   cout<<"thread1 sell ticket : "<<tickets-<<endl;   LeaveCriticalSection(&am

15、p;g_cs);    else     LeaveCriticalSection(&g_cs);   break;  return 0;DWORD WINAPI Fun2Proc(  LPVOID lpParameter   / thread data)while(TRUE)  EnterCriticalSection(&g_cs);  Sleep(1);  

16、if(tickets>0)     Sleep(1);   cout<<"thread2 sell ticket : "<<tickets-<<endl;   LeaveCriticalSection(&g_cs);    else      LeaveCriticalSection(&g_cs);   

17、60;break;   return 0;七、在視頻Lesson16 的 Code 中,Chat 的函數(shù)代碼, OnSock 函數(shù)忘記釋放內(nèi)存了,可以在出錯判斷的地方以及將要返回的地方加釋放內(nèi)存的語句 ( delete wsabuf.buf )。void CChatDlg:OnSock(WPARAM wParam,LPARAM lParam)switch(LOWORD(lParam)case FD_READ:  WSABUF wsabuf;  wsabuf.buf=new char200;  wsabuf.len=

18、200;  DWORD dwRead;  DWORD dwFlag=0;  SOCKADDR_IN addrFrom;  int len=sizeof(SOCKADDR);  CString str;  CString strTemp;  HOSTENT *pHost;  if(SOCKET_ERROR=WSARecvFrom(m_socket,&wsabuf,1,&dwRead,&dwFlag, &#

19、160;    (SOCKADDR*)&addrFrom,&len,NULL,NULL)     MessageBox("接收數(shù)據(jù)失?。?quot;);   delete wsabuf.buf; / 這里加一句釋放內(nèi)存的語句   return;    pHost=gethostbyaddr(char*)&addrFrom.sin_addr.S_un.S_addr,4,AF_INET); 

20、60;/str.Format("%s說 :%s",inet_ntoa(addrFrom.sin_addr),wsabuf.buf);  str.Format("%s說 :%s",pHost->h_name,wsabuf.buf);  str+="rn"  GetDlgItemText(IDC_EDIT_RECV,strTemp);  str+=strTemp;  SetDlgItemText(IDC_EDIT_RECV,str);

21、  delete wsabuf.buf; / 這里加一句釋放內(nèi)存的語句  break;八、在視頻Lesson17的剪貼板編程的代碼中,有一個問題,修改如下:if(OpenClipboard()  if(IsClipboardFormatAvailable(CF_TEXT)     HANDLE hClip;   char *pBuf;   hClip = GetClipboardData(CF_TEXT);   pBuf = (char *)GlobalLock(hClip);   GlobalUnlock(hClip);   SetDlgItemText(IDC_EDIT_RECV, pBuf);   /CloseClipboard();/去掉這一句。錯誤原因:如果程序沒有進入第二個if語句, 那么剪貼板不會關(guān)閉。     CloseClipboard();/在這里添加關(guān)閉剪貼板的操作。 九、在視頻Lesson18中,在OnInte

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論