多线程画线
- https://blog.csdn.net/arcsinsin/article/details/16832417这个讲解的很好
- 建立线程步骤如下:
- 1、在CXXXDlg.h文件插入要建立的线程
// Exercise3Dlg.h : 头文件
//
#pragma once
#include "afxcmn.h"
#include "afxwin.h"
UINT Write1(LPVOID pParam); //自己插入
// CExercise3Dlg 对话框
- 2、在CXXXDlg.cpp文件中插入
#include "afxmt.h" //自己插入
#ifdef _DEBUG
#define new DEBUG_NEW
CCriticalSection critical_section; //自己插入
#endif
- 3、添加线程函数,写在CXXXDlg.cpp文件最下面
UINT Write1(LPVOID pParam)
{
//锁定临界区,其它线程遇到critical_section.Lock();语句时要等待
//直至执行critical_section.Unlock();语句
critical_section.Lock();
//需要线程实现的内容
critical_section.Unlock();
Sleep(200);
return 0;
}
- 4、按钮的点击响应函数void CXXXDlg::OnBnClickedButton1()里添加调用线程:
CWinThread *pWrite1=AfxBeginThread(Write1,(LPVOID)&m_picShow,
THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
pWrite1->ResumeThread();
多线程同时划线的假象
- 所谓的多线程同时画线,实际是依次调用了三个线程,在每个线程里画线段的循环里,进行短暂临界区抢占和释放,然后sleep一段时间。
- 相当于线程一占用的临界区一释放,1进入sleep同时,线程二就抢占了临界区,画了她的第一条线段,再释放,2进入sleep同时,三立刻抢占……以此类推……
和上周代码的区别有:
1、存放生成的随机数的数组变成了全局变量,不然线程没办法调用,因为线程不属于对话框的类。
2、为picture建立基类为CEdit的变量m_picShow。
3、同理,画线段的画笔和笔刷都是全局变量。画线moveto和lineto都挪到了线程里。
4、在按钮响应函数里获得的下拉框的两个所选值也是全局变量,所以在CXXXDlg.cpp最上面的声明是这样的:
#include "afxmt.h" //自己添加
#ifdef _DEBUG
#define new DEBUG_NEW
CCriticalSection critical_section; //自己
int data1[52]; //自己
int data2[52];
int data3[52];
int index,column=0;
//int n=0;
CDC *pDC1;
CDC *pDC2;
CDC *pDC3;
CPen Pen1(PS_SOLID,2,RGB(32,178,170));
CPen Pen2(PS_SOLID,2,RGB(139,115,85));
CPen Pen3(PS_SOLID,2,RGB(135,206,<