C#生产流程控制(串行,并行混合执行)

开源框架CsGo

https://gitee.com/hamasm/CsGo?_from=gitee_search

文档资料:

https://blog.csdn.net/aa2528877987/article/details/132139337

实现效果

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

using Go;

using System;

using System.Collections.Generic;

using System.Threading.Tasks;

using System.Windows.Forms;

using TaskControl.gadget;

using Module = TaskControl.gadget.Module;

namespace TaskControl

{

    public partial class MainForm : Form

    {

        //work_service work = new work_service();

        //shared_strand strand;

        control_strand _mainStrand;

        generator _timeAction;

        Dictionary<int, Module> DicModules = new Dictionary<int, Module>();

        int maxWorkerIndex = 2;

        bool continuous = false;

        bool stop = false;

        public MainForm()

        {

            InitializeComponent();

        }

        private void MainForm_Load(object sender, EventArgs e)

        {

            //strand = new work_strand(work);

            //generator.go(strand, WorkerFlow);

            _mainStrand = new control_strand(this);

            _timeAction = generator.make(_mainStrand, WorkerFlow);

            //generator.tgo(_mainStrand, WorkerFlow);

        }

        private void btnClear_Click(object sender, EventArgs e)

        {

            ClearMessage();

        }

        private void btnControl_Click(object sender, EventArgs e)

        {

            AddMessage(btnControl.Text);

            switch (btnControl.Text)

            {

                case "启动任务":

                    btnControl.Text = "暂停任务";

                    AddMessage("===== 开始生产 =====");

                    //

                    // 可配置执行顺序

                    DicModules.Clear();

                    DicModules.Add(1, module1);

                    DicModules.Add(2, module2);

                    stop = false;

                    //work.run();

                    _timeAction.run();

                    break;

                case "暂停任务":

                    btnControl.Text = "恢复任务";

                    //work.stop();

                    _timeAction.suspend();

                    break;

                case "恢复任务":

                    btnControl.Text = "暂停任务";

                    //work.reset();

                    _timeAction.resume();

                    break;

            }

        }

        private void btnContinuous_Click(object sender, EventArgs e)

        {

            AddMessage(btnContinuous.Text);

            switch (btnContinuous.Text)

            {

                case "循环生产":

                    btnContinuous.Text = "取消循环";

                    continuous = true;

                    break;

                case "取消循环":

                    btnContinuous.Text = "循环生产";

                    continuous = false;

                    break;

            }

        }

        private void btnStop_Click(object sender, EventArgs e)

        {

            AddMessage(btnStop.Text);

            switch (btnStop.Text)

            {

                case "结束生产":

                    btnStop.Text = "继续生产";

                    stop = true;

                    break;

                case "继续生产":

                    btnStop.Text = "结束生产";

                    stop = false;

                    break;

            }

        }

        async Task WorkerFlow()

        {

            // 罐仓同时加料

            generator.children children = new generator.children();

            foreach (var item in DicModules)

            {

                children.go(() => AddPot(item.Key, item.Value));

            }

            await children.wait_all();

            //

            await Worker();

        }

        async Task Worker(int index = 1)

        {

            if (index > maxWorkerIndex)

            {

                if (continuous)

                {

                    index = 1;// 循环生产

                    ClearMessage();

                }

                else

                {

                    AddMessage("===== 生产结束 =====");

                    return;

                }

            }

            AddMessage($"顺序生产:{index}");

            var module = DicModules[index];

            if (null == module) return;

            // 加料(串行)

            await AddPot(index, module);

            // 卸料(串行)

            await RemovePot(index, module);

            generator.children children = new generator.children();

            children.go(() => MoveBelt(index)); // 皮带传输(并行)

            children.go(() => AddPot(index, module));// 罐仓加料(并行)

            if (!stop) children.go(() => Worker(++index)); // 继续生产

            await children.wait_all();

        }

        /// <summary>

        /// 罐仓加料

        /// </summary>

        async Task AddPot(int index, Module module)

        {

            var currentPotVal = module.Pot.Value;

            if (currentPotVal >= module.Pot.Maximum)

            {

                AddMessage($"罐仓已满,跳过加料:【{index}】");

                return;

            }

            AddMessage($"开始加料:【{index}】");

            for (int i = currentPotVal; i <= module.Pot.Maximum; i++)

            {

                module.Pot.Value = i;

                await generator.sleep(50);

            }

            AddMessage($"结束加料:【{index}】");

        }

        /// <summary>

        /// 罐仓卸料

        /// </summary>

        async Task RemovePot(int index, Module module)

        {

            AddMessage($"开始卸料:【{index}】");

            for (int i = module.Pot.Maximum; i > 0; i--)

            {

                module.Pot.Value = i;

                await generator.sleep(50);

            }

            AddMessage($"结束卸料:【{index}】");

        }

        /// <summary>

        /// 皮带传输(工作几秒后停止-并行)

        /// </summary>

        /// <param name="index"></param>

        async Task MoveBelt(int index)

        {

            AddMessage($"开始传输:【{index}】");

            var module = DicModules[index];

            if (null == module) return;

            module.Belt.ConveyorDirection = ConveyorDirection.Forward;

            await generator.sleep(5000);

            module.Belt.ConveyorDirection = ConveyorDirection.None;

            AddMessage($"结束传输:【{index}】");

        }

        public void AddMessage(string msg)

        {

            if (IsDisposed) return;

            this.BeginInvoke((EventHandler)(delegate

            {

                if (rtbMsg.Lines.Length > 100)

                {

                    rtbMsg.Clear();

                }

                rtbMsg.AppendText(DateTime.Now.ToString("yy-MM-dd HH:mm:ss") + " " + msg + "\r\n");

                Application.DoEvents();

            }));

        }

        public void ClearMessage()

        {

            this.BeginInvoke((EventHandler)(delegate

            {

                rtbMsg.Clear();

            }));

        }

    }

}

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

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

相关文章

Windows11 Docker Desktop 启动 -wsl kernel version too low

系统环境&#xff1a;windows11 1&#xff1a;docker下载 Docker: Accelerated Container Application Development 下载后双击安装即可 安装后启动Docker提示&#xff1a;Docker Desktop -wsl kernel version too low 处理起来也是非常方便 1:管理员身份启动&#xff1a;…

C#程序随系统启动例子 - 开源研究系列文章

今天讲讲C#中应用程序随系统启动的例子。 我们知道&#xff0c;应用程序随系统启动&#xff0c;都是直接在操作系统注册表中写入程序的启动参数&#xff0c;这样操作系统在启动的时候就根据启动参数来启动应用程序&#xff0c;而我们要做的就是将程序启动参数写入注册表即可。此…

【3Ds Max】车削命令的简单使用(以制作花瓶为例)

简介 在3ds Max中&#xff0c;"车削"&#xff08;Lathe&#xff09;是一种建模命令&#xff0c;用于创建围绕轴线旋转的几何形状。通过车削命令&#xff0c;您可以将一个闭合的平面或曲线几何形状旋转&#xff0c;从而生成一个立体对象。这种方法常用于创建圆柱体、…

大数据Flink学习圣经:一本书实现大数据Flink自由

学习目标&#xff1a;三栖合一架构师 本文是《大数据Flink学习圣经》 V1版本&#xff0c;是 《尼恩 大数据 面试宝典》姊妹篇。 这里特别说明一下&#xff1a;《尼恩 大数据 面试宝典》5个专题 PDF 自首次发布以来&#xff0c; 已经汇集了 好几百题&#xff0c;大量的大厂面试…

【制作npm包4】api-extractor 学习

制作npm包目录 本文是系列文章&#xff0c; 作者一个橙子pro&#xff0c;本系列文章大纲如下。转载或者商业修改必须注明文章出处 一、申请npm账号、个人包和组织包区别 二、了解 package.json 相关配置 三、 了解 tsconfig.json 相关配置 四、 api-extractor 学习 五、npm包…

Dockerfile自定义镜像

文章目录 Dockerfile自定义镜像镜像结构Dockerfile语法构建java项目 小结 Dockerfile自定义镜像 常见的镜像在DockerHub就能找到&#xff0c;但是我们自己写的项目就必须自己构建镜像了。 而要自定义镜像&#xff0c;就必须先了解镜像的结构才行。 镜像结构 镜像是将应用程序及…

服务器数据库中了360后缀勒索病毒怎么办?360后缀勒索病毒的加密形式

随着信息技术的发展&#xff0c;企业的计算机服务器数据库变得越来越重要。然而&#xff0c;在数字时代&#xff0c;网络上的威胁也日益增多。近期&#xff0c;我们收到很多企业的求助&#xff0c;企业的计算机服务器遭到了360后缀勒索病毒的攻击&#xff0c;导致服务器内的所有…

《TCP IP网络编程》第二十四章

第 24 章 制作 HTTP 服务器端 24.1 HTTP 概要 本章将编写 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;服务器端&#xff0c;即 Web 服务器端。 理解 Web 服务器端&#xff1a; web服务器端就是要基于 HTTP 协议&#xff0c;将网页对…

easyx图形库基础:3实现弹球小游戏

实现弹球小游戏 一.实现弹球小游戏:1.初始化布&#xff1a;2.初始化一个球的信息&#xff1a;3.球的移动和碰撞反弹4.底边挡板的绘制和移动碰撞重置数据。 二.整体代码&#xff1a; 一.实现弹球小游戏: 1.初始化布&#xff1a; int main() {initgraph(800, 600);setorigin(40…

[论文笔记]Glancing Transformer for Non-Autoregressive Neural Machine Translation

引言 这是论文Glancing Transformer for Non-Autoregressive Neural Machine Translation的笔记。 传统的非自回归文本生成速度较慢,因为需要给定之前的token来预测下一个token。但自回归模型虽然效率高,但性能没那么好。 这篇论文提出了Glancing Transformer,可以只需要一…

layui下拉框select 弹出层在最外层

出现问题如图所示 想要的效果是如下 这样的效果只需一行代码就能解决 .layui-layer-page .layui-layer-content{overflow: visible!important;}

Postgresql源码(112)plpgsql执行sql时变量何时替换为值

相关 《Postgresql源码&#xff08;41&#xff09;plpgsql函数编译执行流程分析》 《Postgresql源码&#xff08;46&#xff09;plpgsql中的变量类型及对应关系》 《Postgresql源码&#xff08;49&#xff09;plpgsql函数编译执行流程分析总结》 《Postgresql源码&#xff08;5…

PyTorch从零开始实现ResNet

文章目录 代码实现参考 代码实现 本文实现 ResNet原论文 Deep Residual Learning for Image Recognition 中的50层&#xff0c;101层和152层残差连接。 代码中使用基础残差块这个概念&#xff0c;这里的基础残差块指的是上图中红色矩形圈出的内容&#xff1a;从上到下分别使用…

感觉和身边其他人有差距怎么办?

虽然清楚知识需要靠时间沉淀&#xff0c;但在看到自己做不出来的题别人会做&#xff0c;自己写不出的代码别人会写时还是会感到焦虑怎么办&#xff1f; 你是否也因为自身跟周围人的差距而产生过迷茫&#xff0c;这份迷茫如今是被你克服了还是仍旧让你感到困扰&#xff1f; 下…

LabVIEW开发最小化5G系统测试平台

LabVIEW开发最小化5G系统测试平台 由于具有大量存储能力和数据的应用程序的智能手机的激增&#xff0c;当前一代产品被迫提高其吞吐效率。正交频分复用由于其卓越的品质&#xff0c;如单抽头均衡和具有成本效益的实施&#xff0c;现在被广泛用作物理层技术。这些好处是以严格的…

ElasticSearch索引库、文档、RestClient操作

文章目录 一、索引库1、mapping属性2、索引库的crud 二、文档的crud三、RestClient 一、索引库 es中的索引是指相同类型的文档集合&#xff0c;即mysql中表的概念 映射&#xff1a;索引中文档字段的约束&#xff0c;比如名称、类型 1、mapping属性 mapping映射是对索引库中文…

公网远程连接Redis数据库详解

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 前言 洁洁的个人主页 我就问你有没有发挥&#xff0…

通讯录实现【C语言】

目录 前言 一、整体逻辑分析 二、实现步骤 1、创建菜单和多次操作问题 2、创建通讯录 3、初始化通讯录 4、添加联系人 5、显示联系人 6、删除指定联系人 ​7、查找指定联系人 8、修改联系人信息 9、排序联系人信息 三、全部源码 前言 我们上期已经详细的介绍了自定…

Java SpringBoot Vue ERP系统

系统介绍 该ERP系统基于SpringBoot框架和SaaS模式&#xff0c;支持多租户&#xff0c;专注进销存财务生产功能。主要模块有零售管理、采购管理、销售管理、仓库管理、财务管理、报表查询、系统管理等。支持预付款、收入支出、仓库调拨、组装拆卸、订单等特色功能。拥有商品库存…

ubuntu设置共享文件夹成功后却不显示找不到(已解决)

1.首先输下面命令查看是否真的设置成功共享文件夹 vmware-hgfsclient如果确实已经设置过共享文件夹将输出window下共享文件夹名字 2.确认自己已设置共享文件夹后输入下面的命令 //如果之前没有命令包则先执行sudo apt-get install open-vm-tools sudo vmhgfs-fuse .host:/ /mn…