15 线程

news2024/11/13 16:08:29

文章目录

  • 线程创建
  • MFC使用CreateThread线程案例(AfxBeginThread MFC 创建线程)
    • 开始创建线程
    • 线程暂停继续
    • 结束线程
    • 全部代码

线程创建

#include <stdio.h>
#include <Windows.h>

//线程处理函数
//线程1
DWORD WINAPI DoWork1(LPVOID lpParameter)
{
	int i = 0;
	while (1)
	{
		printf("子线程:%d\n", i);
		i++;
	}
	return 0;
}

//线程2 ;主线程传递参数到子线程
DWORD WINAPI DoWork2(LPVOID lpParameter)
{
	int n = *((int*)(lpParameter));

	printf("n=%d\n", n);//比较危险
	return 0;
}


void Create()
{
	//创建一个子线程
	//第一个参数:安全属性
	//第二个参数:初始化线程堆栈 0自动初始化
	//第三个参数:线程处理函数
	//第四个参数:线程传递的参数
	//第五个参数:线程标志
	//第六个参数:线程Id,返回一个线程的ID,需要线程ID填写,不需要填写NULL
	DWORD dwThreadId;
	HANDLE hDoWork1 = CreateThread(NULL, 0, DoWork1, NULL, 0, &dwThreadId);

	//主线程传递参数到子线程
	//注意参数生命周期要足够长
	int n = 10;//传递的参数,局部变量
	HANDLE hDoWork1 = CreateThread(NULL, 0, DoWork2, &n, 0, &dwThreadId);

}


//main 函数是主线程的入口函数
int main()
{
	Create();
	
	int i = 0;
	while (1)
	{
		printf("主循环:%d\n", i);
		i++;
	}

	printf("hello wrold\n");

	return 0;
}

在这里插入图片描述

MFC使用CreateThread线程案例(AfxBeginThread MFC 创建线程)

ui 设置
在这里插入图片描述

开始创建线程

void CThreadDlg::OnBnClickedBtnStart()
{
	//创建一个线程
	m_hThread =CreateThread(NULL, 0, Work, this, 0, NULL);
}

线程处理函数

//线程函数
DWORD WINAPI Work(LPVOID lpParam)
{
	CThreadDlg* pDlg = (CThreadDlg*)lpParam;
	while (1)
	{
		pDlg->UpateMessage(L"111111");
	}
	return 0;
}
void CThreadDlg::UpateMessage(CString strMsg)
{
	int nLength=m_edit.GetWindowTextLength();
	m_edit.SetSel(nLength, - 1);
	strMsg = strMsg + L"\r\n";
	m_edit.ReplaceSel(strMsg);
}

线程暂停继续

void CThreadDlg::OnBnClickedBtnPause()
{
	CString str;
	GetDlgItemText(IDC_BTN_PAUSE,str);
	if (str == L"暂停")
	{
		SuspendThread(m_hThread);// 暂停
		SetDlgItemText(IDC_BTN_PAUSE, L"继续");
	}
	else
	{
		ResumeThread(m_hThread);
		SetDlgItemText(IDC_BTN_PAUSE, L"暂停");
	}
}

结束线程

//结束
void CThreadDlg::OnBnClickedBtnClose()
{
	TerminateThread(m_hThread,0);
}

全部代码

ThreadDlg.cpp: 实现文件

// ThreadDlg.cpp: 实现文件
//

#include "pch.h"
#include "framework.h"
#include "Thread.h"
#include "ThreadDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CThreadDlg 对话框




//线程函数
DWORD WINAPI Work(LPVOID lpParam)
{
	CThreadDlg* pDlg = (CThreadDlg*)lpParam;
	while (1)
	{
		pDlg->UpateMessage(L"111111");
	}
	return 0;
}



CThreadDlg::CThreadDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_THREAD_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	m_hThread = NULL;
}

void CThreadDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_EDIT1, m_edit);
}

BEGIN_MESSAGE_MAP(CThreadDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BTN_START, &CThreadDlg::OnBnClickedBtnStart)
	ON_BN_CLICKED(IDC_BTN_PAUSE, &CThreadDlg::OnBnClickedBtnPause)
	ON_BN_CLICKED(IDC_BTN_CLOSE, &CThreadDlg::OnBnClickedBtnClose)
END_MESSAGE_MAP()


// CThreadDlg 消息处理程序

BOOL CThreadDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CThreadDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CThreadDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}



void CThreadDlg::OnBnClickedBtnStart()
{
	//创建一个线程
	m_hThread =CreateThread(NULL, 0, Work, this, 0, NULL);
}


void CThreadDlg::UpateMessage(CString strMsg)
{
	int nLength=m_edit.GetWindowTextLength();
	m_edit.SetSel(nLength, - 1);
	strMsg = strMsg + L"\r\n";
	m_edit.ReplaceSel(strMsg);
}

//暂停线程
void CThreadDlg::OnBnClickedBtnPause()
{
	CString str;
	GetDlgItemText(IDC_BTN_PAUSE,str);
	if (str == L"暂停")
	{
		SuspendThread(m_hThread);// 暂停
		SetDlgItemText(IDC_BTN_PAUSE, L"继续");
	}
	else
	{
		ResumeThread(m_hThread);
		SetDlgItemText(IDC_BTN_PAUSE, L"暂停");
	}
}


//结束
void CThreadDlg::OnBnClickedBtnClose()
{
	TerminateThread(m_hThread,0);
}

ThreadDlg.h: 头文件

// ThreadDlg.h: 头文件
//

#pragma once


// CThreadDlg 对话框
class CThreadDlg : public CDialogEx
{
// 构造
public:
	CThreadDlg(CWnd* pParent = nullptr);	// 标准构造函数

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_THREAD_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedBtnStart();
	HANDLE m_hThread;
	void UpateMessage(CString strMsg);
	CEdit m_edit;
	afx_msg void OnBnClickedBtnPause();
	afx_msg void OnBnClickedBtnClose();
};

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/714299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BOSHIDA DC电源模块在自动化设备的详细应用

BOSHIDA DC电源模块在自动化设备的详细应用 DC电源模块是自动化设备中经常使用的电源设备&#xff0c;它可以将交流电转换成稳定的直流电&#xff0c;以满足自动化设备的电能需求。以下是DC电源模块在自动化设备中的详细应用&#xff1a; 1. 逆变器控制器&#xff1a;DC电源模…

SciencePub学术 | 算法类重点SCIEEI征稿中

SciencePub学术 刊源推荐: 算法类重点SCI&EI征稿中&#xff01;2区闭源好刊&#xff0c;对国人非常友好。信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; 算法类重点SCI&EI 【期刊简介】IF&#xff1a;6.0-6.5&#xff0c;JCR2区&#xff0c;中…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)三:找回密码界面及对应功能实现

一、本章内容 本章实现找回密码功能,包括短信验证码找回、邮箱验证码找回等功能,并通过node-send-email发送邮箱验证码,实现找回密码界面、接口等功能。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频

cesium鹰眼效果实现(cesium自带方法)

具体思路是&#xff1a;新建一个viewer作为鹰眼地图&#xff0c;监听主地图的相机change事件&#xff0c;手动更新鹰眼地图的视角。 效果&#xff1a; 1. 创建一个id为hawkEyeMap的DOM节点&#xff0c;配置一下样式。 <div id"hawkEyeMap"></div>#hawkE…

在springboot项目做valid注解校验,但是对象是继承pojo(bean)的DTO类怎么办?

将校验注解直接添加到 DTO 类的字段上&#xff0c;而不是添加到父类中。修改 DTO 类的字段声明&#xff0c;将校验注解添加到字段上。例如 Data TableName("t_exam_oral") EqualsAndHashCode(callSuper true) ApiModel(value "ExamOral对象", descripti…

CANDENCE :简单贴装器件封装绘制

紧接candence:常见表贴焊盘绘制举例 简单贴装器件封装绘制 以0603封装电容为例&#xff0c;绘制其封装&#xff0c;这里会用到前面绘制的电容的焊盘。 1、打开PCB editor 软件工具 2、新建一个PACKGE symbol 文件,设置好路径和名称。点击ok确认 3、设置画布尺寸、原点位置、…

四、构建高可用的 Eureka-Server 集群

5.1 对刚才的 eureka-server 修改配置文件 5.1.1 server-1 server:port: 8761 #为什么是 8761&#xff0c;其他端口就报错spring:application:name: eureka-server #服务名称eureka:client:fetch-registry: true #是否拉取服务列表register-with-eureka: true #是否注册自己&…

《PyTorch深度学习实践》第十一讲 循环神经网络(基础篇 + 高级篇)

b站刘二大人《PyTorch深度学习实践》课程第十一讲循环神经网络&#xff08;基础篇 高级篇&#xff09;笔记与代码&#xff1a; https://www.bilibili.com/video/BV1Y7411d7Ys?p12&vd_sourceb17f113d28933824d753a0915d5e3a90 https://www.bilibili.com/video/BV1Y7411d7Y…

netty学习(3):SpringBoot整合netty实现多个客户端与服务器通信

1. 创建SpringBoot父工程 创建一个SpringBoot工程&#xff0c;然后创建三个子模块 整体工程目录&#xff1a;一个server服务&#xff08;netty服务器&#xff09;&#xff0c;两个client服务&#xff08;netty客户端&#xff09; pom文件引入netty依赖&#xff0c;springboot…

国企一面会问什么?

前言&#xff1a; \textcolor{Green}{前言&#xff1a;} 前言&#xff1a; &#x1f49e;快秋招了&#xff0c;那么这个专栏就专门来记录一下&#xff0c;同时呢整理一下常见面试题 &#x1f49e;部分题目来自自己的面试题&#xff0c;部分题目来自网络整理 国企注重的和私企会…

中国各地区新能源汽车产量(2015-2022年) 共13个指标

从各地区统计公报、各地区统计年鉴整理了69个省市的新能源汽车产量数据&#xff0c;并提供了包含原始数据的各个来源。数据显示&#xff0c;中国各地区的新能源汽车产量存在着明显的区域差异。该数据可为各研究人员提供重要参考&#xff0c;有助于制定地方产业发展规划和市场战…

ruoyi-vue | electron打包教程(超详细)

公司项目由于来不及单独做客户端了&#xff0c;所以想到用electron直接将前端打包程exe,dmg等格式的安装包。 由于使用的ruoyi-vue框架开发&#xff0c;所以这篇教程以ruoyi-vue为基础的。 环境说明 nodejs&#xff1a;v16.18.1npm&#xff1a;8.19.2ruoyi-vue&#xff1a;3.8…

基于SQLI的SQL字符型报错注入

基于SQLI的SQL字符型报错注入 一. 实验目的 理解数字型报错SQL注入漏洞点的定位方法&#xff0c;掌握利用手工方式完成一次完整SQL注入的过程&#xff0c;熟悉常见SQL注入命令的操作。 二. 实验环境 渗透主机&#xff1a;KALI平台 用户名: college 密码: 360College 目标网…

Windows 10 执行wsl命令报错: --list -o命令行选项无效 --update命令行选项无效等解决办法

问题说明 在使用wsl命令的时候&#xff0c;wsl --update&#xff0c;wsl --list -o等关键的命令都显示命令行选项无效 但是wsl这个命令却又是一个有效的命令 解决办法 1.卸载旧版本的WSL 没有子系统可以跳过这个步骤 打开命令提示符或PowerShell窗口&#xff08;以管理员身…

深蓝学院C++基础与深度解析笔记 第 10 章 泛型算法与 Lambda 表达式

第 10 章 泛型算法与 Lambda 表达式 1. 泛型算法 1.1 泛型算法&#xff1a; 可以支持多种类型的算法。 int x[100]; std::sort(std: : begin(x), std : :end(x));1.11 这里重点讨论 C 标准库中定义的算法&#xff1a; <algorithm > <numeric> <ranges> 1.…

简洁清新后台模板推荐(光年)

目录 前言一、后台模板介绍1.作者介绍2.模板介绍 二、界面展示1.登录2.首页3.UI元素4.表单5.工具类6.示例页面7.主题选择 三、入口总结 前言 作为后端开发人员&#xff0c;前端技术确实不精通&#xff0c;也没有太多的精力搞前端。所以一直在搜寻一些现成的模板。最近发现一个…

基于单片机的盲人导航智能拐杖老人防丢防摔倒发短息定位

功能介绍 以STM32单片机作为主控系统&#xff1b; OLED液晶当前实时距离&#xff0c;安全距离&#xff0c;当前经纬度信息&#xff1b;超声波检测小于设置的安全距离&#xff0c;蜂鸣器报警提示&#xff1a;低于安全距离&#xff01;超声波检测当前障碍物距离&#xff0c;GPS进…

Linux-CentOS7版本的系统搭建达梦数据库

目录 VMware中安装CentOS 7.5并做相关的配置搭建Docker环境搭建达梦数据库拉取镜像查看镜像命令为镜像设置一个别名根据镜像 创建一个容器 根据镜像 创建一个容器启动并进入容器 VMware中安装CentOS 7.5并做相关的配置 使用VMware安装CentOS7的虚拟机可以参考另外一篇文章&…

netwox构造免费ARP数据包【网络工程】(保姆级图文)

目录 构造免费的 ARP 数据包。1) 构造免费的 ARP 数据包2) 使用 Wireshark 进行抓包 总结 欢迎关注 『网络工程专业』 系列&#xff0c;持续更新中 欢迎关注 『网络工程专业』 系列&#xff0c;持续更新中 温馨提示&#xff1a;对虚拟机做任何设置&#xff0c;建议都要先快照备…

Android修改符盘名称与蓝牙名称

修改符盘名称 android\frameworks\base\media\java\android\mtp\MtpDatabase.java 修改蓝牙名称 android\system\bt\btif\src\btif_dm.cc 注&#xff1a;尽量不在build与device文件下修改设备名称&#xff0c;因为这是套指纹的软件 这里的值必须和之前的软件是一样的