📄 thread~3.cpp
字号:
// ThreadExp1View.cpp : CThreadExp1View 类的实现
//
#include "stdafx.h"
#include "ThreadExp1.h"
#include "ThreadExp1Doc.h"
#include "ThreadExp1View.h"
#include <afxmt.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CThreadExp1View
IMPLEMENT_DYNCREATE(CThreadExp1View, CView)
BEGIN_MESSAGE_MAP(CThreadExp1View, CView)
// 标准打印命令
ON_COMMAND(ID_START, OnStart)
ON_UPDATE_COMMAND_UI(ID_START, OnUpdateStart)
ON_COMMAND(ID_STOP, OnStop)
ON_UPDATE_COMMAND_UI(ID_STOP, OnUpdateStop)
ON_COMMAND(ID_CONTINUE, OnContinue)
ON_UPDATE_COMMAND_UI(ID_CONTINUE, OnUpdateContinue)
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
// CThreadExp1View 构造/销毁
CThreadExp1View::CThreadExp1View()
{
// TODO: 在此处添加构造代码
//设置线程执行与暂停标志为FALSE
m_go=m_suspend=FALSE;
//初始化各线程所对应进度条的位置
for (int i=0; i<7; i++)
m_param[i].yPos=20+i*20;
}
CThreadExp1View::~CThreadExp1View()
{
}
BOOL CThreadExp1View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或
// 样式
return CView::PreCreateWindow(cs);
}
// CThreadExp1View 绘制
void CThreadExp1View::OnDraw(CDC* pDC)
{
CThreadExp1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: 在此处为本机数据添加绘制代码
//绘制进度条外框及文本
static char* strPriority[]= {
"最优", "极高",
"较高", "普通",
"较低", "极底", "空闲" };
pDC->SetTextAlign(TA_RIGHT);
for (int i=0; i<7; i++) {
pDC->TextOut(95, m_param[i].yPos, strPriority[i]);
pDC->Rectangle(100, m_param[i].yPos, 360, m_param[i].yPos+15);
}
//绘制进度条的填充色块
if (m_go) {
pDC->SelectStockObject(BLACK_BRUSH);
for (int i=0; i<7; i++)
pDC->Rectangle(100, m_param[i].yPos,
m_param[i].xPos, m_param[i].yPos+15);
}
}
// CThreadExp1View 打印
BOOL CThreadExp1View::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}
void CThreadExp1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 打印前添加额外的初始化
}
void CThreadExp1View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 打印后添加清除过程
}
// CThreadExp1View 诊断
#ifdef _DEBUG
void CThreadExp1View::AssertValid() const
{
CView::AssertValid();
}
void CThreadExp1View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CThreadExp1Doc* CThreadExp1View::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CThreadExp1Doc)));
return (CThreadExp1Doc*)m_pDocument;
}
#endif //_DEBUG
//定义视类
CThreadExp1View* gpView;
//定义开始与结束事件对象
CEvent gThreadStartEvent(FALSE, TRUE);
CEvent gThreadEndEvent(FALSE, TRUE);
UINT ThreadsProc(LPVOID pParam)
{
int yOrg=((PARAM*)pParam)->yPos;
//使线程等待启动
gThreadStartEvent.Lock(INFINITE);
//获取设备环境对象
CDC* pDC=gpView->GetDC();
//选择和黑色画刷
pDC->SelectStockObject(BLACK_BRUSH);
while ((((PARAM*)pParam)->xPos)<360) {
//执行线程操作
for (int j=0; j<450000; j++) {}
//显示线程的操作进度
pDC->Rectangle(100, yOrg, ((PARAM*)pParam)->xPos, yOrg+15);
(((PARAM*)pParam)->xPos)++;
}
//释放设备环境对象
gpView->ReleaseDC(pDC);
//调用结束线程函数
gpView->OnExit();
gThreadEndEvent.Lock(INFINITE);
return 0;
}
void CThreadExp1View::OnStart()
{
//设置线程的优先级个
int ThreadPriority[]= {
THREAD_PRIORITY_TIME_CRITICAL,
THREAD_PRIORITY_HIGHEST,
THREAD_PRIORITY_ABOVE_NORMAL,
THREAD_PRIORITY_NORMAL,
THREAD_PRIORITY_BELOW_NORMAL,
THREAD_PRIORITY_LOWEST,
THREAD_PRIORITY_IDLE
};
//存储CThreadExo1View视对象
gpView=this;
m_EndThreadCount=0;
//设置线程结束事件为无信号状态
gThreadEndEvent.ResetEvent();
//依次创建7中不同优先级的工作线程
for (int i=0; i<7; i++) {
m_param[i].xPos=100;
m_pThread[i]=AfxBeginThread(&ThreadsProc,
(LPVOID)&m_param[i], ThreadPriority[i]);
}
//设置线程暂停标志为FALSE
m_suspend=FALSE;
//设置线程执行标志为TRUE
m_go=TRUE;
//设置线程开始事件为有信号状态
gThreadStartEvent.SetEvent();
}
void CThreadExp1View::OnUpdateStart(CCmdUI* pCmdUI)
{
pCmdUI->Enable(!m_go);
}
void CThreadExp1View::OnStop()
{
//暂停线程的执行
for (int i=0; i<7; i++) m_pThread[i]->SuspendThread();
//设置暂停执行的标记为TRUE
m_suspend=TRUE;
}
void CThreadExp1View::OnUpdateStop(CCmdUI* pCmdUI)
{
//线程处于暂停状态时,设置此按钮为无效状态
pCmdUI->Enable(m_go && !m_suspend);
}
void CThreadExp1View::OnContinue()
{
//唤醒各线程,使之继续执行
for (int i=0; i<7; i++) m_pThread[i]->ResumeThread();
//设置暂停执行的标记为FALSE
m_suspend=FALSE;
}
void CThreadExp1View::OnUpdateContinue(CCmdUI* pCmdUI)
{
//线程被唤醒时,设置此按钮为无效状态
pCmdUI->Enable(m_go && m_suspend);
}
void CThreadExp1View::OnExit()
{
//对执行完的线程计数
if (++m_EndThreadCount>=7)
{
//如全部执行完则结束所有线程
gThreadEndEvent.SetEvent();
gThreadStartEvent.ResetEvent();
m_go=FALSE;
//重绘视图
Invalidate();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -