C#项目05-猜数字多线程

news2025/4/8 7:42:50

本项目利用多线程,通过点击按钮猜数字,

知识点

线程

基本概念

进程:一组资源,构成一个正在运行的程序,这些资源包括地址空间、文件句柄以及程序启动需要的其他东西的载体。

线程:体现一个程序的真实执行情况,

线程和进程的关系:

  • 默认情况下,一个进程只包含一个线程,从程序开始执行一直到程序结束
  • 一个线程可以发起另外一个线程,一个进程都可能在不同状态有多个线程来执行程序的不同部分
  • 如果一个进程中有多个线程,它们会分享进程的资源
  • 线程是由系统负责调度的处理器(而不是进程)上的执行单元

声明周期

创建、启动、运行、阻塞、等待、睡眠、终止。

创建(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 中所有控件的基类。它提供了控件的基本功能,如大小、位置、颜色、字体等。常见的控件如 ButtonTextBoxLabel 等都继承自 Control 类。

主要属性和方法:

  • Text: 获取或设置与控件关联的文本。
  • Location: 获取或设置控件的位置。
  • Size: 获取或设置控件的大小。
  • Visible: 获取或设置一个值,该值指示是否显示该控件。
  • Enabled: 获取或设置一个值,该值指示控件是否可以对用户交互作出响应。
  • BackColor: 获取或设置控件的背景色。
  • ForeColor: 获取或设置控件的前景色。
  • Font: 获取或设置控件显示的文本的字体。
  • Parent: 获取或设置控件的父容器。
  • Controls: 获取包含在控件内的控件的集合。

Control.ControlCollection

ControlCollection 类表示控件的集合,通常用于管理容器控件(如 FormPanelGroupBox 等)中的子控件。每个容器控件都有一个 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个按钮,每个按钮根据数值依次命名

  • 生成随机数,根据生成的随机数,依次点击按钮,如果按钮上的数字和随机产生的数字一致,则提示数字猜对,否则则继续猜

在这里插入图片描述

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

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

相关文章

《C语言动态顺序表:从内存管理到功能实现》

1.顺序表 1.1 概念 顺序存储的线性表&#xff0c;叫顺序表。 1.2顺序表存放的实现方式 可以使用数组存储数据&#xff0c;可以实现逻辑上相连&#xff0c;物理内存上也相连。也可以使用malloc在堆区申请一片连续的空间&#xff0c;存放数据&#xff0c;实现逻辑上相连&#…

通过API 调用本地部署 deepseek-r1 模型

如何本地部署 deepseek 请参考&#xff08;windows 部署安装 大模型 DeepSeek-R1&#xff09; 那么实际使用中需要开启API模式&#xff0c;这样可以无拘无束地通过API集成的方式&#xff0c;集成到各种第三方系统和应用当中。 上遍文章是基于Ollama框架运行了deepSeek R1模型…

DeepSeek-学习与实践

1.应用场景 主要用于学习与使用DeepSeek解决问题, 提高效率. 2.学习/操作 1.文档阅读 文档 DeepSeek -- 官网, 直接使用 --- 代理网站 --- 极客智坊 https://poe.com/DeepSeek-R1 https://time.geekbang.com/search?qdeepseek -- 搜索deepseek的资料 资料 20250209DeepSeekC…

撕碎QT面具(6):调节窗口大小后,控件被挤得重叠的解决方法

问题&#xff1a;控件重叠 分析原因&#xff1a;因为设置了最小大小&#xff0c;所以界面中的大小不会随窗口的变化而自动变化。 处理方案&#xff1a;修改mimumSize的宽度与高度为0&#xff0c;并设置sizePolicy为Expanding&#xff0c;让其自动伸缩。 结果展示&#xff08;自…

解锁机器学习核心算法 | K-平均:揭开K-平均算法的神秘面纱

一、引言 机器学习算法种类繁多&#xff0c;它们各自有着独特的优势和应用场景。前面我们学习了线性回归算法、逻辑回归算法、决策树算法。而今天&#xff0c;我们要深入探讨的是其中一种经典且广泛应用的聚类算法 —— K - 平均算法&#xff08;K-Means Algorithm&#xff09…

【Linux】匿名管道的应用场景-----管道进程池

目录 一、池化技术 二、简易进程池的实现&#xff1a; Makefile task.h task.cpp Initchannel函数&#xff1a; 创建任务&#xff1a; 控制子进程&#xff1a; 子进程执行任务&#xff1a; 清理收尾&#xff1a; 三、全部代码&#xff1a; 前言&#xff1a; 对于管…

PostgreSQL的学习心得和知识总结(一百六十九)|深入理解PostgreSQL数据库之 Group By 键值消除 的使用和实现

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

Python基于循环神经网络的情感分类系统(附源码,文档说明)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

Zookeeper应用案例-分布式锁-实现思路

以下是具体实现代码 第一步&#xff1a;注册锁节点 第二步&#xff1a;获取锁节点&#xff0c;如果自己是最小的节点&#xff0c;就获取权限 第三步&#xff1a;拿到锁就开始自己的业务逻辑 第四步&#xff1a;业务逻辑好了就要释放这把锁 第五步&#xff1a;重新注册监听&…

java练习(32)

ps&#xff1a;题目来自力扣 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表…

伯克利 CS61A 课堂笔记 10 —— Trees

本系列为加州伯克利大学著名 Python 基础课程 CS61A 的课堂笔记整理&#xff0c;全英文内容&#xff0c;文末附词汇解释。 目录 01 Trees 树 Ⅰ Tree Abstraction Ⅱ Implementing the Tree Abstraction 02 Tree Processing 建树过程 Ⅰ Fibonacci tree Ⅱ Tree Process…

让编程变成一种享受-明基RD320U显示器

引言 作为一名有着多年JAVA开发经验的从业者&#xff0c;在工作过程中&#xff0c;显示器的重要性不言而喻。它不仅是我们与代码交互的窗口&#xff0c;更是影响工作效率和体验的关键因素。在多年的编程生涯中&#xff0c;我遇到过各种各样的问题。比如&#xff0c;在进行代码…

10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统

作者&#xff1a;后端小肥肠 目录 1. 前言 为什么选择DeepSeek&#xff1f; 本文技术栈 2. 环境准备 2.1. 后端项目初始化 2.2. 前端项目初始化 3. 后端服务开发 3.1. 配置文件 3.2. 核心服务实现 4. 前端服务开发 4.1. 聊天组件ChatWindow.vue开发 5. 效果展示及源…

Linux环境开发工具

Linux软件包管理器yum Linux下安装软件方式&#xff1a; 源代码安装rpm安装——Linux安装包yum安装——解决安装源、安装版本、安装依赖的问题 yum对应于Windows系统下的应用商店 使用Linux系统的人&#xff1a;大部分是职业程序员 客户端怎么知道去哪里下载软件&#xff1…

JupyterNotebook高级使用:常用魔法命令

%%writefile test.py def Test(name):print("Test",name,"success")运行结果&#xff1a;就是在我们的文件目录下面创建了这个test.py文件&#xff0c;主要是认识一下这个里面的%%writefile表示创建新的文件&#xff0c;这个文件里面的内容就是上面我们定义…

C++ Primer 类的作用域

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

50页PDF|数字化转型成熟度模型与评估(附下载)

一、前言 这份报告依据GBT 43439-2023标准&#xff0c;详细介绍了数字化转型的成熟度模型和评估方法。报告将成熟度分为五个等级&#xff0c;从一级的基础转型意识&#xff0c;到五级的基于数据的生态价值构建与创新&#xff0c;涵盖了组织、技术、数据、资源、数字化运营等多…

机器学习实战(8):降维技术——主成分分析(PCA)

第8集&#xff1a;降维技术——主成分分析&#xff08;PCA&#xff09; 在机器学习中&#xff0c;降维&#xff08;Dimensionality Reduction&#xff09; 是一种重要的数据处理技术&#xff0c;用于减少特征维度、去除噪声并提高模型效率。主成分分析&#xff08;Principal C…

前端插件使用xlsx-populate,花样配置excel内容,根据坐添加标替换excel内容,修改颜色,合并单元格...。

需求要求&#xff1a;业务人员有个非常复杂得excel表格&#xff0c;各种表头等&#xff0c;但是模板是固定得。当然也可以实现在excel上搞出各种表格&#xff0c;但是不如直接用已有模板替换其中要动态得内容方便&#xff0c;这里我们用到CSDN得 xlsx-populate 插件。 实列中我…

分布式大语言模型服务引擎vLLM论文解读

论文地址&#xff1a;Efficient Memory Management for Large Language Model Serving with PagedAttention 摘要 大语言模型&#xff08;LLMs&#xff09;的高吞吐量服务需要一次对足够多的请求进行批处理。然而&#xff0c;现有系统面临困境&#xff0c;因为每个请求的键值…