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.hqwc.cn/news/82182.html

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

相关文章

Apache Doris IP变更问题详解

Apache Doris IP变更问题详解 一、背景二、环境硬件信息软件信息 三、FE恢复3.1 异常日志3.2 获取当前ip3.3 重置ip信息3.4 重置元数据记录3.5 元数据模式恢复3.6 重置fe集群节点3.7 关闭元数据模式重启fe 四、BE恢复4.1 获取当前ip4.2 重置ip信息4.3 重置be集群节点 一、背景 …

【java】【项目实战】[外卖一]软件开发实战流程分析、介绍、准备

前言&#xff1a;开始java项目实战了&#xff0c;紧张、刺激不。本文介绍软件开发流程以及本外卖项目的介绍 一、软件开发流程 二、角色分工 三、软件环境 四、外卖项目介绍 4.1 项目介绍 4.1.1 管理端(后台系统) 4.1.2 用户端(业务系统) 4.2 产品原型展示 4.2.1 管理端原型…

小米AI音箱联网升级折腾记录(解决配网失败+升级失败等问题)

小米AI音箱&#xff08;一代&#xff09;联网升级折腾记录 我折腾了半天终于勉强能进入下载升级包这步&#xff0c;算是成功一半吧… 总结就是&#xff0c;网络信号一定要好&#xff0c;需要不停换网找到兼容的网&#xff0c;还需要仔细配置DNS让音响连的上api.mina.mi.com 推荐…

数据结构(Java实现)-集合与时间和空间复杂度

什么是集合框架 Java 集合框架 Java Collection Framework &#xff0c;又被称为容器 container &#xff0c;是定义在 java.util 包下的一组接口 interfaces 和其实现类 classes 。 什么是数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之…

常见前端面试之VUE面试题汇总六

17. MVVM 的优缺点? 优点: 分离视图&#xff08;View&#xff09;和模型&#xff08;Model&#xff09;&#xff0c;降低代码耦合&#xff0c;提⾼视图或者 逻辑的重⽤性: ⽐如视图&#xff08;View&#xff09;可以独⽴于 Model 变化和修改&#xff0c;⼀个 ViewModel 可以…

【Java】基础练习(十一)

1.Poker 定义两个数组&#xff0c;一个数组存储扑克牌花色&#xff0c;另一个数组存储扑克牌&#xff08;A~K&#xff09;&#xff0c;输出52张扑克牌&#xff08;除大小王&#xff09; ♥A、♥2...&#xff08;1&#xff09;Poker类&#xff1a; package swp.kaifamiao.cod…

图为科技-边缘计算在智慧医疗领域的作用

边缘计算在智慧医疗领域的作用 随着科技的进步&#xff0c;智慧医疗已成为医疗行业的重要发展趋势。边缘计算作为新兴技术&#xff0c;在智慧医疗领域发挥着越来越重要的作用。本文将介绍边缘计算在智慧医疗领域的应用及其优势&#xff0c;并探讨未来发展方向。 一、边缘计算…

十、pikachu之php反序列化

文章目录 1、php反序列化概述2、实战3、关于Magic function4、__wakeup()和destruct() 1、php反序列化概述 在理解这个漏洞前&#xff0c;首先搞清楚php中serialize()&#xff0c;unserialize()这两个函数。 &#xff08;1&#xff09;序列化serialize()&#xff1a;就是把一个…

python自动化入门之Python编写脚本实现自动化爬虫详解

想知道如何使用Python轻松高效地获取网络上的信息&#xff1f; 本篇文章将探索Python自动化爬虫&#xff0c;并展示如何编写实用的脚本。 1. 什么是Python爬虫&#xff1f; 爬虫顾名思义&#xff0c;就是像蜘蛛一样在网络上爬行&#xff0c;抓取各种有用信息的一种程序。而Pyt…

上半年营收19亿,金融壹账通第二增长曲线“加速上坡”

8月16日&#xff0c;壹账通金融科技有限公司&#xff08;下称“金融壹账通”&#xff09;发布了截至2023年6月30日中期业绩报告。 根据财报&#xff0c;2023年上半年&#xff0c;金融壹账通实现营收18.99亿元&#xff0c;毛利润为6.96亿元&#xff1b;归母净利润率从-26.1%提升…

【前端】深入解析CSS:选择器、显示模式、背景属性和特征剖析

目录 一、前言二、CSS的复合选择器1、后代选择器①、语法②、注意事项 2、子选择器①、语法②、注意事项 3、并集选择器①、语法②、注意事项 4、链接伪类选择器①、语法②、注意事项 三、CSS元素显示模式转换1、转换为块元素display:block2、转换为行内元素display:inline3、转…

synchronized锁升级

在 Java SE 1.6中&#xff0c; 锁 一共有 4 种状 态 &#xff0c; 级别 从低到高依次是&#xff1a;无 锁 状 态 、偏向 锁 状 态 、 轻 量 级锁 状 态和重量 级锁 状 态 &#xff0c; 这 几个状 态 会随着 竞 争情况逐 渐 升 级 。 锁 可以升 级 但不能降 级 &#xff0c;意味…