- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
VC深入详解视频勘误和说明全解
一、在视频Lesson2中,在介绍构造函数时,我说:“构造函数最重要的作用是创建对象本身,对象内存的分配由构造函数来完成的”,这句话是错的,对象内存的分配和构造函数没有关系,对象内存的分配是由编译器来完成的,构造函数的作用是对对象本身做初始化工作,也就是给用户提供初始化类中成员变量的一种方式,在类对象有虚表的情况下,构造函数还对虚表进行初始化。
另外,我说:“C++又规定,如果一个类没有提供任何的构造函数,则C++提供一个默认的构造函数(由C++编译器提供)”,这句话也是错误的,正确的是:
如果一个类中没有定义任何的构造函数,那么编译器只有在以下三种情况,才会提供默认的构造函数:
1、如果类有虚拟成员函数或者虚拟继承父类(即有虚拟基类)时;
2、如果类的基类有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数);
3、在类中的所有非静态的对象数据成员,它们对应的类中有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数)。
二、在视频 Lesson4 的Code 中,画扇形用如下代码即可:
if(m_bDraw == TRUE){??dc.MoveTo(m_ptOrigin);??dc.LineTo(point);}
带边线的扇形用如下代码即可:if(m_bDraw == TRUE){??dc.MoveTo(m_ptOrigin);??dc.LineTo(point);??dc.LineTo(m_ptOld);??m_ptOld = point;}
三、关于在对话框上放置组合框的问题,我说“如果拖动的矩形较小,组合框的列表框部分将无法显示,此时也无法调整组合框的上下位置的大小了”。实际上,组合框的上下位置还是可以调整的,调整的办法如下:
在对话框资源处于编辑状态时,将鼠标移动到组合框控件右边向下的箭头上,当鼠标变成上下箭头形状时,单击鼠标左键,此时可以看到举行框围绕着组合框。将鼠标移动到该矩形框下端的蓝色小方块上,当鼠标变成上下箭头形状时,按住鼠标左键向下拖动,直到把组合框的下拉列表框范围拖动到合适的大小时松开鼠标左键。
四、在视频Lesson16的事件代码中,有一个问题,修改如下:
void main(){HANDLE hThread1;HANDLE hThread2;
g_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL); //将CreateEvent()函数放置在这个位置
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);CloseHandle(hThread1);CloseHandle(hThread2);
//g_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);//取消这个位置的CreateEvent()函数。
/*g_hEvent=CreateEvent(NULL,FALSE,FALSE,tickets);if(g_hEvent){??if(ERROR_ALREADY_EXISTS==GetLastError())??{?? coutonly instance can run!endl;?? return;??}}*/SetEvent(g_hEvent);
Sleep(4000);CloseHandle(g_hEvent);}
原因:如果在线程产生之后调用CreateEvent(),假如线程提前被操作系统调度,那么线程里的 WaitForSingleObject 等待的将是一个空的g_hEvent, 在这种情况下,WaitForSingleObject 将返回WAIT_FAILED 。这个问题可以通过在CreateEvent()函数前添加Sleep(10)的调用来查看。
五、在视频Lesson16的采用事件的多线程同步代码中,有一个问题:在线程1和线程2的代码中,有下面一段:
while(TRUE){??WaitForSingleObject(g_hEvent,INFINITE);??if(tickets0)??{?? Sleep(1);?? coutthread1 sell ticket : tickets--endl;??}??else?? break;??SetEvent(g_hEvent);}
这个代码有一个问题,当线程1或线程2卖完最后一张票时,调用SetEvent(g_hEvent);将事件对象设置为有信号状态,另一个线程等待到事件对象,开始执行代码,判断ticket
文档评论(0)