MFC_9.4_建立线程、多线程同时画线的假象、静态建立线程、设置按钮禁用、Ontimer,动态建立线程

这篇博客详细介绍了如何在MFC中创建线程进行多线程画线,包括步骤和代码示例。通过线程临界区抢占和释放的机制,模拟同时画线的效果。同时,提到了使用WM_TIMER消息响应函数实现定时器功能,并讨论了处理未知数目线程的方法。
摘要由CSDN通过智能技术生成

多线程画线

// 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,<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值