C#项目05-猜数字多线程
本项目利用多线程,通过点击按钮猜数字,
知识点
线程
基本概念
进程:一组资源,构成一个正在运行的程序,这些资源包括地址空间、文件句柄以及程序启动需要的其他东西的载体。
线程:体现一个程序的真实执行情况,
线程和进程的关系:
- 默认情况下,一个进程只包含一个线程,从程序开始执行一直到程序结束
- 一个线程可以发起另外一个线程,一个进程都可能在不同状态有多个线程来执行程序的不同部分
- 如果一个进程中有多个线程,它们会分享进程的资源
- 线程是由系统负责调度的处理器(而不是进程)上的执行单元
声明周期
创建、启动、运行、阻塞、等待、睡眠、终止。
创建(Created):线程对象被创建,但尚未开始执行。它处于就绪状态,等待被调度执行。
启动(Started):调用线程的Start方法后,线程进入启动状态。此时,线程堆栈被分配,但线程尚未开始执行。
运行(Running):线程被调度并开始执行。它正在使用CPU资源执行代码。
阻塞(Blocked):线程因为等待某个资源(如锁、文件I/O等)而无法继续执行。阻塞状态可以是正常的,也可能是由于异常导致的。
等待(Waiting):线程正在等待某个事件或方法完成,如Thread.Sleep、Monitor.Wait等。
睡眠(Sleeping):线程因为调用了Thread.Sleep方法而暂时停止执行。它会在指定的时间后自动唤醒。
终止(Terminated):线程的执行完成,或者因为异常而被强行终止。一旦线程终止,它就不能再次被启动。
各个状态的转换为:
新建(New)→ 创建(Created)
创建(Created)→ 启动(Started)
启动(Started)→ 运行(Running)
运行(Running)→ 阻塞(Blocked)/ 等待(Waiting)/ 睡眠(Sleeping)
阻塞(Blocked)/ 等待(Waiting)/ 睡眠(Sleeping)→ 运行(Running)
运行(Running)→ 终止(Terminated)
Thread P_th = new Thread(new ThreadStart(方法名称));//创建线程。方法名称可以是委托
P_th.IsBackground = true;//设置线程为后台线程
P_th.Start();//开始执行线程
Control.ControlCollection
这里做个区分。control和Control.ControlCollection的区别。
Control
Control 类是 Windows Forms 中所有控件的基类。它提供了控件的基本功能,如大小、位置、颜色、字体等。常见的控件如 Button、TextBox、Label 等都继承自 Control 类。
主要属性和方法:
- Text: 获取或设置与控件关联的文本。
- Location: 获取或设置控件的位置。
- Size: 获取或设置控件的大小。
- Visible: 获取或设置一个值,该值指示是否显示该控件。
- Enabled: 获取或设置一个值,该值指示控件是否可以对用户交互作出响应。
- BackColor: 获取或设置控件的背景色。
- ForeColor: 获取或设置控件的前景色。
- Font: 获取或设置控件显示的文本的字体。
- Parent: 获取或设置控件的父容器。
- Controls: 获取包含在控件内的控件的集合。
Control.ControlCollection
ControlCollection 类表示控件的集合,通常用于管理容器控件(如 Form、Panel、GroupBox 等)中的子控件。每个容器控件都有一个 Controls 属性,该属性返回一个 ControlCollection 对象,用于管理其子控件。
-
Count: 获取集合中的控件数。
-
Item: 获取或设置集合中指定索引处的控件。
-
Add: 将指定的控件添加到集合中。
-
Remove: 从集合中移除指定的控件。当你已经有一个控件的实例,并且想从集合中移除它时使用。
-
Clear: 从集合中移除所有控件。
-
Contains: 确定集合中是否包含指定的控件。
-
IndexOf: 返回集合中指定控件的索引。
-
ContainsKey:确定 Control.ControlCollection是否包含具有指定键的项。这里的项通常是控件的
Name属性) -
RemoveAt:在指定的索引位置从控件集合移除控件,当你知道要移除的控件在集合中的索引位置时使用。
//Remove和RemoveAt的区别 // 创建两个按钮 Button button1 = new Button { Name = "Button1", Text = "Click Me 1" }; Button button2 = new Button { Name = "Button2", Text = "Click Me 2" };// 将按钮添加到控件集合 Controls.Add(button1); Controls.Add(button2);// 使用 Remove 移除 button1 Controls.Remove(button1);// 使用 RemoveAt 移除索引为 0 的控件(即 button2) Controls.RemoveAt(0);//ContainsKey和Contains的区别 if (Controls.ContainsKey("button1")) {// 集合中包含名为 "button1" 的控件 }Button button1 = new Button(); Controls.Add(button1);if (Controls.Contains(button1)) {// 集合中包含 button1 控件实例 }
Invoke
Invoke其实用法只有两种情况:
Control的Invoke
Delegate的Invoke
也就是说,Invoke前面要么是一个控件,要么是一个委托对象。本项目用到的control.invoke。
control.invoke(参数[delegate])方法:在拥有此控件的基础窗口句柄的线程上执行指定的委托。(同步)
其本质是一个方法,通过对象来调用。
Control的Invoke一般用于解决跨线程访问的问题,比如你想操作一个按钮button,你就要用button.Invoke,你想操作一个文本label,你就要用label.Invoke.但是大家会发现很麻烦,如果我既然想操作button,又操作label,能不能写在一起呢?有没有更简单的方法呢?
其实主窗体使一个Form,Form自然也是继承了Control的,所以Form也有Invoke的方法,如果你想省点事,就可以直接调用Form.Invoke,这就是常见的this.Invoke.
为什么有的Invoke前面啥都没有?其实前面是this,只不过省略了.
MethodInvoker
一个委托,该委托可以执行托管代码中声明为void且不接受任何参数的任何方法。
在对控件的 invoke 方法进行调用时或需要一个简单委托又不想自己定义时可以使用该委托
//跨线程访问Invoke(new MethodInvoker(delegate{textBox1.Text = "修改了";})); //开启新线程 td, 在新线程中使用MethodInvoker 委托执行 run()方法, 这个时候 run() 方法其实是在主线程中执行的, 这样就避免了 //跨线程访问控件private void btnOK_Click(object sender, EventArgs e){Thread td = new Thread(new ThreadStart(threadRun));td.Start();}/// <summary>/// 主线程要执行的方法/// </summary>private void run(){this.textBox1.Text = "修改了";}/// <summary>/// 子线程线程方法/// </summary>private void threadRun(){MethodInvoker In = new MethodInvoker(run);this.BeginInvoke(In);}
另外关于MethodInvoker和EventHandler的区别。
public delegate void MethodInvoker();
public delegate void EventHandler(object sender, EventArgs e);
MethodInvoker 是不带参数的委托。
EventHandler 是可带参数的委托。
其实跨线程访问控件,就是重新创建一个线程,然后调用主线程的方法。
三元条件运算符
condition ? consequent : alternative//condition 表达式的计算结果必须为 true 或 false。 若 condition 的计算结果为 true,将计算 consequent,其结果成为运算结果。 若 condition 的计算结果为 false,将计算 alternative,其结果成为运算结果is this condition true ? yes : no
实现逻辑
-
自动生成60个按钮,每个按钮根据数值依次命名
-
生成随机数,根据生成的随机数,依次点击按钮,如果按钮上的数字和随机产生的数字一致,则提示数字猜对,否则则继续猜

相关文章:
C#项目05-猜数字多线程
本项目利用多线程,通过点击按钮猜数字, 知识点 线程 基本概念 进程:一组资源,构成一个正在运行的程序,这些资源包括地址空间、文件句柄以及程序启动需要的其他东西的载体。 线程:体现一个程序的真实执行情况, 线…...
前端504错误分析
前端出现504错误(网关超时)通常是由于代理服务器未能及时从上游服务获取响应。以下是详细分析步骤和解决方案: 1. 确认错误来源 504含义:代理服务器(如Nginx、Apache)在等待后端服务响应时超时。常见架构:前端 → 代理服务器 → 后端服务,问题通常出在代理与后端之间。…...
《C语言动态顺序表:从内存管理到功能实现》
1.顺序表 1.1 概念 顺序存储的线性表,叫顺序表。 1.2顺序表存放的实现方式 可以使用数组存储数据,可以实现逻辑上相连,物理内存上也相连。也可以使用malloc在堆区申请一片连续的空间,存放数据,实现逻辑上相连&#…...
通过API 调用本地部署 deepseek-r1 模型
如何本地部署 deepseek 请参考(windows 部署安装 大模型 DeepSeek-R1) 那么实际使用中需要开启API模式,这样可以无拘无束地通过API集成的方式,集成到各种第三方系统和应用当中。 上遍文章是基于Ollama框架运行了deepSeek R1模型…...
DeepSeek-学习与实践
1.应用场景 主要用于学习与使用DeepSeek解决问题, 提高效率. 2.学习/操作 1.文档阅读 文档 DeepSeek -- 官网, 直接使用 --- 代理网站 --- 极客智坊 https://poe.com/DeepSeek-R1 https://time.geekbang.com/search?qdeepseek -- 搜索deepseek的资料 资料 20250209DeepSeekC…...
DeepSeek和ChatGPT的全面对比
一、模型基础架构对比(2023技术版本) 维度DeepSeekChatGPT模型家族LLAMA架构改进GPT-4优化版本参数量级开放7B/35B/120B闭源175B位置编码RoPE NTK扩展ALiBiAttention机制FlashAttention-3FlashAttention-2激活函数SwiGLU ProGeGLU训练框架DeepSpeedMeg…...
无线网络安全配置指南:WPA、WPA2、WPA3及WAPI详解
对于做 Wi-Fi 的朋友,大家可能天天都需要配置各种加密和模式,但是有时候可能会一时忘记如何配置,基于日常的工作经验,总结了一篇文档:《无线网络安全配置指南:WPA、WPA2、WPA3及WAPI详解》,具体…...
撕碎QT面具(6):调节窗口大小后,控件被挤得重叠的解决方法
问题:控件重叠 分析原因:因为设置了最小大小,所以界面中的大小不会随窗口的变化而自动变化。 处理方案:修改mimumSize的宽度与高度为0,并设置sizePolicy为Expanding,让其自动伸缩。 结果展示(自…...
解锁机器学习核心算法 | K-平均:揭开K-平均算法的神秘面纱
一、引言 机器学习算法种类繁多,它们各自有着独特的优势和应用场景。前面我们学习了线性回归算法、逻辑回归算法、决策树算法。而今天,我们要深入探讨的是其中一种经典且广泛应用的聚类算法 —— K - 平均算法(K-Means Algorithm)…...
【Linux】匿名管道的应用场景-----管道进程池
目录 一、池化技术 二、简易进程池的实现: Makefile task.h task.cpp Initchannel函数: 创建任务: 控制子进程: 子进程执行任务: 清理收尾: 三、全部代码: 前言: 对于管…...
机器学习(1)安装Pytorch
1.安装命令 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 2.安装过程Log: Looking in indexes: https://download.pytorch.org/whl/cu118 Co…...
Linux 多Python版本统一和 PySpark 依赖 python 包方案
背景 Linux 服务器经常有多个Python版本,比如 Python2 有两个版本,Python3 有两个版本。在使用上容易混淆,而且有些需要新增一些 module 更容易,安装如果路径不统一,导致日常使用时,会出现找不到新安装mod…...
PostgreSQL的学习心得和知识总结(一百六十九)|深入理解PostgreSQL数据库之 Group By 键值消除 的使用和实现
目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…...
DeepSeek是什么?两种模型的对比?
最近DeepSeek的风也是很大,它也是很火,那么DeepSeek是什么呢? 什么是DeepSeek? DeepSeek是一家专注通用人工智能(AGI)的中国科技公司,主攻大模型研发与应用。DeepSeek-R1是其开源的推理模型&a…...
跟着 Lua 5.1 官方参考文档学习 Lua (2)
文章目录 2.3 – Variables2.4 – Statements2.4.1 – Chunks2.4.2 – Blocks2.4.3 – Assignment2.4.4 – Control Structures2.4.5 – For Statement2.4.6 – Function Calls as Statements2.4.7 – Local Declarations 2.3 – Variables Variables are places that store v…...
Python基于循环神经网络的情感分类系统(附源码,文档说明)
博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇dz…...
Zookeeper应用案例-分布式锁-实现思路
以下是具体实现代码 第一步:注册锁节点 第二步:获取锁节点,如果自己是最小的节点,就获取权限 第三步:拿到锁就开始自己的业务逻辑 第四步:业务逻辑好了就要释放这把锁 第五步:重新注册监听&…...
java练习(32)
ps:题目来自力扣 环形链表 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表…...
伯克利 CS61A 课堂笔记 10 —— Trees
本系列为加州伯克利大学著名 Python 基础课程 CS61A 的课堂笔记整理,全英文内容,文末附词汇解释。 目录 01 Trees 树 Ⅰ Tree Abstraction Ⅱ Implementing the Tree Abstraction 02 Tree Processing 建树过程 Ⅰ Fibonacci tree Ⅱ Tree Process…...
让编程变成一种享受-明基RD320U显示器
引言 作为一名有着多年JAVA开发经验的从业者,在工作过程中,显示器的重要性不言而喻。它不仅是我们与代码交互的窗口,更是影响工作效率和体验的关键因素。在多年的编程生涯中,我遇到过各种各样的问题。比如,在进行代码…...
10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统
作者:后端小肥肠 目录 1. 前言 为什么选择DeepSeek? 本文技术栈 2. 环境准备 2.1. 后端项目初始化 2.2. 前端项目初始化 3. 后端服务开发 3.1. 配置文件 3.2. 核心服务实现 4. 前端服务开发 4.1. 聊天组件ChatWindow.vue开发 5. 效果展示及源…...
LeetCode 0624.数组列表中的最大距离:只关心最小最大值
【LetMeFly】624.数组列表中的最大距离:只关心最小最大值 力扣题目链接:https://leetcode.cn/problems/maximum-distance-in-arrays/ 给定 m 个数组,每个数组都已经按照升序排好序了。 现在你需要从两个不同的数组中选择两个整数ÿ…...
如何解决服务器端口被攻击:全面防护与快速响应
服务器端口被攻击是网络安全中常见的问题之一,尤其是当服务器暴露在公共网络上时,容易成为黑客的目标。攻击者可能通过扫描开放端口、利用漏洞或发动拒绝服务(DoS/DDoS)攻击来破坏服务器的正常运行。本文将详细介绍如何检测、防御…...
Golang深度学习
前言 在2009年,Google公司发布了一种新的编程语言,名为Go(或称为Golang),旨在提高编程效率、简化并发编程,并提供强大的标准库支持。Go语言的设计者们希望通过Go语言能够解决软件开发中的一些长期存在的问…...
Linux环境开发工具
Linux软件包管理器yum Linux下安装软件方式: 源代码安装rpm安装——Linux安装包yum安装——解决安装源、安装版本、安装依赖的问题 yum对应于Windows系统下的应用商店 使用Linux系统的人:大部分是职业程序员 客户端怎么知道去哪里下载软件࿱…...
JupyterNotebook高级使用:常用魔法命令
%%writefile test.py def Test(name):print("Test",name,"success")运行结果:就是在我们的文件目录下面创建了这个test.py文件,主要是认识一下这个里面的%%writefile表示创建新的文件,这个文件里面的内容就是上面我们定义…...
C++ Primer 类的作用域
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
【建设工程经济】2.1-2.2 经济效果评价的相关概念及指标体系
一、学前建议 学习内容主要有: ①财务评价的内容:盈利能力分析、偿债能力分析、财务可持续能力分析(财务生存能力); ②经济效果评价方法分类:确定性和不确定性评价、定量分析和定性分析、静态分析和动态分…...
如何用ollama快速布署deepseek-r1大模型
deepseek在春节期间因为特朗普的一番发言而在中国已几乎人尽皆知,热度到了连90高寿的老父亲都向我推荐这个中国产的AI大模型,而且它是开源的!我试验了下,用ollama也可以快速度安装布署deepseek-r1大模型。本想写篇文章来介绍下dee…...
50页PDF|数字化转型成熟度模型与评估(附下载)
一、前言 这份报告依据GBT 43439-2023标准,详细介绍了数字化转型的成熟度模型和评估方法。报告将成熟度分为五个等级,从一级的基础转型意识,到五级的基于数据的生态价值构建与创新,涵盖了组织、技术、数据、资源、数字化运营等多…...
