第26课 如何设置绘图 以及 多线程的应用

来源:互联网 发布:单片机usb供电电路图 编辑:程序博客网 时间:2024/05/21 17:35

 1.在MFC的Document—View架构中涉及绘图的代码可以通过以下几种方式来进行设计:

 ①全部通过OnDraw函数来绘制图形,只要其他函数涉及绘图的功能,都可以通过操作系统来激励OnPaint来调用该函数进行绘图。导致的结果:这样不用意出错误。但是数据量大,操作频繁的时候容易引起闪屏。

 ②可以通过在什么地方需要绘图,就在那里写绘制图形的代码。导致结果:绘图代码过于分散,不便于维护,以及以后的升级和代码重用。

 ③可以将绘图代码写在一块,然后谁需要绘制图形,谁就调用相关的函数。导致结果:便于维护,升级和代码重用。


2.多线程方面的知识:

 ①线程状态及其相互转换:

    线程有四种状态:创建,运行,挂起,销毁。 

    进程本身可以自己进行挂起,但是必须等到别的进程来进行唤醒。


②线程冲突的原因:可以使用共享区

③防止线程冲突的方式,设置临界区。

 1.首先要创建一个临界区全局对象 : CCriticalSection g_CriticalSection;

 2.在需要用到临界区的地方,对象加锁:g_CriticalSection.Lock();在加锁后,其他线程中,凡是用到此全局对象的,在运行到临界区发现加锁之后,就挂起,等待释放资源然后在竞争。

    运行完相关区域之后解锁:g_CriticalSection.Unlock();

#include <Windows.h>#include <iostream>using namespace std;HANDLE handle;CRITICAL_SECTION g_cs;DWORD WINAPI WinThread(LPVOID lp){EnterCriticalSection(&g_cs);for (int i = 0 ; i < 1000 ; ++i){cout << "子进程正在运行"<<endl;}LeaveCriticalSection(&g_cs);return 0;}int main(){handle = CreateThread(NULL,0,WinThread,NULL,0,NULL);InitializeCriticalSection(&g_cs);for (int i = 0 ; i < 10 ; i++){cout <<"主线程没有进入临界区"<<endl;}EnterCriticalSection(&g_cs);for (int i = 0 ; i < 10 ; i++){cout <<"主线程进入临界区!!!!!!"<<endl;}LeaveCriticalSection(&g_cs);DeleteCriticalSection(&g_cs);cin.get();cin.get();return 0;}


 

3.临界区内部的代码越少越好,更准确的说是代码运行的时间越少越好。线程同步是用来保证线程可以不间断的访问临界区里面的数据。如果占用资源时间太长,会造成假死的现象。


0 0
原创粉丝点击