⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 thread~3.cpp

📁 vc++net很不错的一个工具
💻 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 + -