麻烦各位看看下面这个,该怎么实现

明缘 2020-02-17 03:17:09
如下需求
有4个任务(a,b,c,d),每一个任务里面有的可能包含启动Timer去执行别的任务,那么下一个任务必须等上一个任务执行完后才能执行。
比如当前执行a ,a 里面会有一个timer过5秒后启动执行一个动作,在这个动作里面可能还有一个timer,执行,执行完后再去执行b,b里面
可能也有timer,执行完才能去执行c,而且执行的可能为a,b,c也可能是a,c,d也可能是a,b,d。
...全文
1106 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
晕了晕了晕了
GreenDreamer 2020-02-23
  • 打赏
  • 举报
回复
四个线程,四个锁,运行先去判断锁。锁释放了走线程。线程完了释放锁,然后就是看冲突,没有冲突就成功
jimmy212 2020-02-23
  • 打赏
  • 举报
回复
也可以使用简单的delegate,类似于EventHandler,用户输入什么,你就 += 到这个delegate
然后直接执行delegate就好了,delegate也是一个个按顺序执行的
方法应该很多吧
熊木木! 2020-02-21
  • 打赏
  • 举报
回复
可以弄个1-4的随机整数,对应abcd ,然后随机决定下一个动作是什么,当然,每执行一个后,要排除对应的随机数。
red-fly 2020-02-21
  • 打赏
  • 举报
回复
既然不是同时执行,那就一个任务一个函数,先创建一个线程,在线程里顺序调用4个任务函数:
a();
b();
c();
d();
你可能还有顺序的不同,那是根据上一个任务的结果?那就通过每个任务的结果去决定下一个任务的调用,比如:
int val = a();
if (val == 0)
val = b();
else
val = c();
后面的执行一样。

对于某个任务中有timer,那就在任务中等待这个timer执行完后继续执行就可以了,比如
timer1_task = 1;
startTimer1(); // 在整个timer的任务执行完后,就置timer1_task为0
waitTimerTaskEnd(); // 可以死循环判断timer1_task是否为0,如果不为0,就一直循环
... // 后序任务代码
对于timer中嵌套timer,也是同样的方法
jhbfghg 2020-02-19
  • 打赏
  • 举报
回复
我来卡看看是的所带的
luj_1768 2020-02-19
  • 打赏
  • 举报
回复
可以把启用timer放在函数尾部退出前,可以在前面设置好timer,到程序结尾时再启用。几个函数都可以这么处理。
  • 打赏
  • 举报
回复
如下需求
有4个任务(a,b,c,d),每一个任务里面有的可能包含启动Timer去执行别的任务,那么下一个任务必须等上一个任务执行完后才能执行。
比如当前执行a ,a 里面会有一个timer过5秒后启动执行一个动作,在这个动作里面可能还有一个timer,执行,执行完后再去执行b,b里面
可能也有timer,执行完才能去执行c,而且执行的可能为a,b,c也可能是a,c,d也可能是a,b,d。
weixin_43351281 2020-02-19
  • 打赏
  • 举报
回复
小白一枚少时诵诗书
兼言MKER 2020-02-19
  • 打赏
  • 举报
回复
直接用线程就可以啊
吉普赛的歌 2020-02-18
  • 打赏
  • 举报
回复
用线程池就好了。 做好一个队列,第一个加入到线程池,执行完,第一个出,最后一个入。就这么简单。 如果暂时没有任务,弄一个等待1秒的任务放队列就可以了。 需要执行 abcd 其中一个任务时, 放到队列即可。 你唯一要做的事情, 就是维护这个队列而已。
明缘 2020-02-18
  • 打赏
  • 举报
回复
引用 8 楼 正怒月神 的回复:
如果是固定顺序,比如a,b,c 那么,我觉得就直接是task.wait就好了。
不是固定顺序
明缘 2020-02-18
  • 打赏
  • 举报
回复
引用 7 楼 正怒月神 的回复:
我没有明白, 比如当前执行a ,a 里面会有一个timer过5秒后启动执行一个动作,在这个动作里面可能还有一个timer,执行,执行完后再去执行b,b里面 可能也有timer,执行完才能去执行c,而且执行的可能为a,b,c也可能是a,c,d也可能是a,b,d。 既然,a执行完,才能执行b,b执行完,才能执行c。那么后面几种情况是怎么来的?
我这个其实是一个Console程序,之所以可以是a,b,c,d 还可以是a,c,d等等是由用户输入的命令行参数决定的。 比如这个 console.exe a b c console.exe a b c d console.exe b c d console.exe b d c a
xugq979 2020-02-18
  • 打赏
  • 举报
回复
建一个类:一个线程,一个忙闲标志(布尔型) 创建一个 类的数组,线程启动,标志忙;结束标志 闲置。 新任务来 ,在数组中 找闲置 的线程 来执行任务。 我曾经做过一个 小工具,从数据库里拿任务,分配到线程中 ,每个线程可以处理 一个或者多个任务 。 有可能能解答你的问题。
正怒月神 2020-02-18
  • 打赏
  • 举报
回复
如果是固定顺序,比如a,b,c 那么,我觉得就直接是task.wait就好了。
正怒月神 2020-02-18
  • 打赏
  • 举报
回复
我没有明白, 比如当前执行a ,a 里面会有一个timer过5秒后启动执行一个动作,在这个动作里面可能还有一个timer,执行,执行完后再去执行b,b里面 可能也有timer,执行完才能去执行c,而且执行的可能为a,b,c也可能是a,c,d也可能是a,b,d。 既然,a执行完,才能执行b,b执行完,才能执行c。那么后面几种情况是怎么来的?
xian_wwq 2020-02-18
  • 打赏
  • 举报
回复
1.如果要实现线程同步的同时,线程之间还要有交互,就要用到同步事件。 同步事件有两种:AutoResetEvent和 ManualResetEvent。 它们唯一不同的地方就是在激活线程之后,状态是否自动由终止变为非终止。 2.在线程中不推荐再使用timer, 特别是timer的方法如果不可重入,会导致很多问题 使用线程池或抽象基本更高的任务比较好
良朋 2020-02-18
  • 打赏
  • 举报
回复
如果每个任务都比较单一,就不用用timer了,直接用线程。
比如 a,b,c,d 四个线程
a.start();
a.join();
b.strart();
b.join();
c.start();
c.join();
d.start();
d.join();
如果每个任务都很复杂,里面还有其它动作,建议你用switch case + timer,这样的好处是UI不卡。
wooddy1982 2020-02-18
  • 打赏
  • 举报
回复
1、a,b,c,d四个任务是应该是顺序执行。可以在a里调用了,b里调用c,c里调用d。 2、定义一个标识flag,如a里启动timer1,标识flag++,timer1执行结束标识flag--。 3、timer1里启动timer2标识flag++,timer2执行结束标识flag--。 4、while(true){ if(0!=flag) continue; break; } b();
明缘 2020-02-18
  • 打赏
  • 举报
回复
引用 2 楼 阿蒙Amon 的回复:
可以使用线程,Join

可否具体说说
加载更多回复(5)

110,500

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧