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

 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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值