操作系统课程设计总结

<一>老师、学长总结

1.老师示例为C#编写的弹球程序,使用界面线程来更新界面,由于每个弹球线程更新速度太快,直接在界面画图会出现闪烁现象,因此要先画到image上,画完后通知界面,定时来更新,避免了闪烁情况;

上文所述的通知是通过委托来实现的,C#用invoke接受委托,用于跨线程之间的调用。

2.WIN32中的WinMain是注册窗口类,用于显示和更新窗口,进入消息循环;

WINAPI用于规定参数的传递顺序和调节堆栈平衡。

3.创建线程函数

(1)CreateThread 由操作系统提供,主要给编译厂商使用,编写程序时最好不使用;

(2)_beginthreadex 在C/C++中使用,不用于MFC中;

(3)AfxBeginThread 用于MFC中。

4.编程过程中常见的判断错误

编程时经常会因为将等于号"=="误写为赋值符号"="出现bug,而且整个调试过程会非常痛苦,以后不妨把if(A==0)写为if(0==A),这样当误写为if(0=A)的时候,编译系统会检查出来并且报错。

5.界面线程用来显示数据、画图,子线程用来处理数据,各司其职,但是子线程不能用来直接向界面传递消息,虽然子线程可以直接操作控件,但可能会出现意想不到的错误。在此需要引入一个主线程,子线程和界面之间的沟通交流需要通过主线程来实现,子线程向主线程传递消息,主线程向页面传递消息,可以做到有条不紊平稳运行。

<二>课设过程中遇到的问题(我使用的是MFC)

1.使用SetTimer函数生成定时器,函数原型为UINT SetTimer(UINT nIDEvent,UINT nElapse,void...) ;

第一个参数为定时器ID,是定时器的标示,通过标示来确定执行onTimer函数中哪一个case分支;

第二个参数为时间延迟,单位为毫秒,即过多久触发一次定时器;

第三个参数为回调函数,NULL为默认回调函数;

编程过程中遇到的问题:定时器无法触发,起初一直以为是没有设置定时器,后来查资料发现是有一个参数没有修改,解决方案为:在ClassWizard里,选择需要计时器的类,添加WM_TIMER消息映射,就自动生成OnTimer函数了。然后在函数里添加代码,让代码实现功能。每隔一段时间就会自动执行一次。

验收的时候老师建议不使用定时器来更新页面,因为定时器需要和页面争用线程信息,这样很容易会导致页面死锁,实际测试过程中确实经常遇到页面死锁的情况;

2.error C2011:一个类被定义多次,原因为类的头文件被多次include,解决方案为在文件头加上"#progma once"或者用IF !DEFINE ***  DEFINE *** .......ENDIF来避免这类错误发生。

3.声明的每一个类最后要加上分号";",否则编译器会报错。

4.不同页面之间通过声明外部变量来共享变量,保证各界面数据同步更新。

5.将主页面赋值给CWnd * cwnd,再通过参数传递或者外部变量的声明,可实现其他页面操控主页面控件。

猜你喜欢

转载自blog.csdn.net/xyq1212/article/details/79448149