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