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.rhkb.cn/news/102576.html

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

相关文章

【通俗易懂】如何使用GitHub上传文件,如何用git在github上传文件

目录 创建 GitHub 仓库 使用 Git 进行操作 步骤 1&#xff1a;初始化本地仓库 步骤 2&#xff1a;切换默认分支 步骤 3&#xff1a;连接到远程仓库 步骤 4&#xff1a;获取远程更改 步骤 5&#xff1a;添加文件到暂存区 步骤 6&#xff1a;提交更改 步骤 7&#xff1a…

Spring框架中JavaBean的生命周期及单例模式与多列模式

Spring框架中JavaBean的生命周期及单例模式与多列模式 1. Spring框架中JavaBean的管理过程1.1 #定义Bean1.2 Bean的实例化1.3 属性注入1.4 初始化方法1.5 Bean的使用和引用1.6 销毁方法 2. 单例模式与原型模式在JavaBean管理中的应用1.在Spring管理JavaBean的过程中&#xff0c…

java八股文面试[数据结构]——ArrayList和LinkedList区别

ArrayList和LinkedList的异同 二者的线程都不安全&#xff0c;相对线程安全的Vector,执行效率高。此外&#xff0c;ArrayList时实现了基于动态数组的数据结构&#xff0c;LinkedList基于链表的数据结构&#xff0c;对于随机访问get和set&#xff0c;ArrayList觉得优于LinkedLis…

sd-webui安装comfyui扩展

文章目录 导读ComfyUI 环境安装1. 安装相关组件2. 启动sd-webui3. 访问sd-webui 错误信息以及解决办法 导读 这篇文章主要给大家介绍如何在sd-webui中来安装ComfyUI插件 ComfyUI ComfyUI是一个基于节点流程式的stable diffusion的绘图工具&#xff0c;它集成了stable diffus…

PV3D: A 3D GENERATIVE MODEL FOR PORTRAITVIDEO GENERATION 【2023 ICLR】

ICLR&#xff1a;International Conference on Learning Representations CCF-A 国际表征学习大会&#xff1a;深度学习的顶级会议 生成对抗网络(GANs)的最新进展已经证明了生成令人惊叹的逼真肖像图像的能力。虽然之前的一些工作已经将这种图像gan应用于无条件的2D人像视频生…

渗透率超90%!智能座舱赛道迎来「存量」替代升级大周期

智能座舱赛道&#xff0c;正在迎来新一轮芯片替代潮。 相比于智能驾驶领域&#xff0c;座舱主机芯片市场并不「性感」&#xff0c;但巨大的存量替代升级机会&#xff0c;也不容小视。 高工智能汽车研究院监测数据显示&#xff0c;2023年1-6月中国市场&#xff08;不含进出口&am…

Docker(二) Docker容器

在docker中的容器都是由镜像所创建的&#xff0c;一个镜像可以创建多个容器。 一、调试Docker 启动Docker systemctl start docker 查看Docker中有哪些镜像 docker images 下载镜像 docker pull hello-world 运行镜像 docker run hello-world 出现 Hello from Docker! 这…

pdf格式怎么编辑?了解这种编辑方法就可以了

pdf格式怎么编辑&#xff1f;PDF作为一种通用的文档格式&#xff0c;以其跨平台、保真排版等优势在各个领域得到广泛应用。然而&#xff0c;对于许多人来说&#xff0c;PDF文件一直以来都被视为“静态”文件&#xff0c;不易编辑。但现在&#xff0c;有很多编辑器可以帮助我们进…

PHP“牵手”拼多多商品详情数据获取方法,拼多多API接口批量获取拼多多商品详情数据说明

拼多多商品详情接口 API 是开放平台提供的一种 API 接口&#xff0c;它可以帮助开发者获取拼多多商品的详细信息&#xff0c;包括商品的标题、描述、图片等信息。在拼多多电商平台的开发中&#xff0c;拼多多详情接口 API 是非常常用的 API&#xff0c;因此本文将详细介绍拼多多…

Php“牵手”淘宝商品销量数据采集方法,淘宝API接口申请指南

淘宝天猫商品销量接口 API 是开放平台提供的一种 API 接口&#xff0c;它可以帮助开发者获取商品的详细信息&#xff0c;包括商品的标题、描述、图片&#xff0c;月销量&#xff0c;总销量等信息。在电商平台的开发中&#xff0c;销量接口API是非常常用的 API&#xff0c;因此本…

Linux解决RocketMQ中NameServer启动问题

启动步骤可以查看官网&#xff0c;https://github.com/apache/rocketmq 一下说明遇到的问题。 1&#xff1a;ROCKETMQ_HOME问题 根据官网提示进入mq/bin目录下&#xff0c;可以使用./mqnamesrv进行NameServer启动&#xff0c;但是会遇到第一个问题&#xff0c;首次下载Rocket…

Windows10批处理命令行设置环境变量笔记,无需重新安装python与chrome

近期&#xff0c;工作中经常安装、部署python生产、开发环境&#xff0c;比较麻烦&#xff0c;也没有心情去优化。突然&#xff0c;我的电脑崩溃了&#xff0c;在重新安装电脑的过程中&#xff0c;保留了原来的安装软件&#xff08;有的没有放在系统盘中&#xff09;&#xff0…

Spring Clould 搜索技术 - elasticsearch

视频地址&#xff1a;微服务&#xff08;SpringCloudRabbitMQDockerRedis搜索分布式&#xff09; 初识ES-什么是elasticsearch&#xff08;P77&#xff0c;P78&#xff09; 1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能…

Docker mysql主从同步安装

1. 构建master实例 docker run -p 3307:3306 --name mysql-master \ -v /mydata/mysql-master/log:/var/log/mysql \ -v /mydata/mysql-master/data:/var/lib/mysql \ -v /mydata/mysql-master/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORDroot \ -d mysql:5.7 2. 构建master配置…

[保研/考研机试] KY212 二叉树遍历 华中科技大学复试上机题 C++实现

题目链接&#xff1a; 二叉树遍历_牛客题霸_牛客网二叉树的前序、中序、后序遍历的定义&#xff1a; 前序遍历&#xff1a;对任一子树&#xff0c;先访问根&#xff0c;然后遍历其左子树&#xff0c;最。题目来自【牛客题霸】https://www.nowcoder.com/share/jump/43719512169…

网络丢包故障如何定位?如何解决?

引言 本期分享一个比较常见的网络问题--丢包。例如我们去ping一个网站&#xff0c;如果能ping通&#xff0c;且网站返回信息全面&#xff0c;则说明与网站服务器的通信是畅通的&#xff0c;如果ping不通&#xff0c;或者网站返回的信息不全等&#xff0c;则很可能是数据被丢包了…

pyqt5 多线程QThread自学记录

pyqt5多线程QThread自学记录 在编写qt的时候不加入多线程&#xff0c;运行程序往往会导致主进程卡死&#xff0c;比如执行下载某视频或者其他执行比较耗时的程序&#xff0c;泛滥了博客&#xff0c;就是没有理解怎么进行槽函数的关联和传递的 经过长时间的攻克&#xff0c;终于…

TCP编程流程(补充)

目录 1、listen&#xff1a; 2、listen、tcp三次握手 3、 发送缓冲区和接收缓冲区&#xff1a; 4、tcp编程启用多线程 1、listen&#xff1a; 执行listen会创建一个监听队列 listen(sockfd,5) 2、listen、tcp三次握手 三次握手 3、 发送缓冲区和接收缓冲区&#xff1a;…

【C++入门到精通】C++入门 —— 模版(template)

阅读导航 前言一、模版的概念二、函数模版1. 函数模板概念2. 函数模板定义格式3. 函数模板的原理4. 函数模版的实例化&#x1f6a9;隐式实例化&#x1f6a9;显式实例化 5. 函数模板的匹配原则 三、类模板1. 类模板的定义格式2. 类模板的实例化 四、非类型模板参数1. 概念2. 定义…

攻击LNMP架构Web应用

环境配置(centos7) 1.php56 php56-fpm //配置epel yum install epel-release rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm//安装php56&#xff0c;php56-fpm及其依赖 yum --enablereporemi install php56-php yum --enablereporemi install php…