中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: [讨论]批处理对抗 上一主题 | 下一主题
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『楼 主』:  [讨论]批处理对抗

To All:

      日来天气闷热无所获,偶得此批处理对抗调度程序[1],同时随意写了一个最简单的对抗代码[2]。虽然作了一些公平性处理,但仍然无法完全达到公平对抗的目标。在数次的测试中,均是优先调度的失败。看看大家有什么办法。

[1] Scheduler.cmd - V1 - 批处理代码对抗调度程序
:: Scheduler.cmd - V1 - 批处理代码对抗调度程序
:: Will Sort - 2006-06-28 - CMD@WinXP
@echo off & setlocal
if not exist battle\ md battle
copy test1.cmd battle>nul
copy test2.cmd battle>nul
cd battle
:Wait1
if 1%time:~6,2% GEQ 157 goto Wait1
set /a sec=1%time:~6,2%+3
set wartime=%time:~0,6%%sec:~1,2%.00
echo Wartime:%wartime%
start test2.cmd %wartime% test1.cmd 2>nul
start test1.cmd %wartime% test2.cmd 2>nul

:Wait2
if exist test1.cmd if exist test2.cmd goto wait2

:Finish
if not exist test1.cmd echo test1 fail!
if not exist test2.cmd echo test2 fail!
cd..
pause
[2] test1.cmd & test2.cmd
@echo off

:Wait
if not "%time%"=="%1" goto wait
echo %time%.
echo Start %0 at %time% ...

:Start
del %2
if exist %2 goto start




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-28 21:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 2 楼』:  

无语。。。
不过就代码上来看,个人认为问题应该出在时间上,批处理似乎并不能很精确地处理时间,而在本例代码中时间精确到了微秒,估计是这方面出了问题。更改代码如下:
:: Scheduler.cmd - V1 - 批处理代码对抗调度程序
:: Will Sort - 2006-06-28 - CMD@WinXP
@echo off & setlocal
if not exist battle\ md battle
copy test1.cmd battle>nul
copy test2.cmd battle>nul
cd battle
:Wait1
if 1%time:~6,2% GEQ 157 goto Wait1
set /a sec=1%time:~6,2%+3
set wartime=%time:~0,6%%sec:~1,2%
echo Wartime:%wartime%
start test2.cmd %wartime% test1.cmd 2>nul
start test1.cmd %wartime% test2.cmd 2>nul

:Wait2
if exist test1.cmd if exist test2.cmd goto wait2

:Finish
if not exist test1.cmd echo test1 fail!
if not exist test2.cmd echo test2 fail!
cd..
pause
test1 & test2:
@echo off

:Wait
if not "%time:~0,8%"=="%1" goto wait
echo %time%.
echo Start %0 at %time% ...

:Start
del %2
if exist %2 goto start
测试了4次,其中test1获胜一次,test2获胜二次,平一次(意料之外……)。
之所以对平一次感到意外,原因如下:
test1:
@echo off
del test2.cmd
test2:
@echo off
del test1.cmd
用鼠标同时选中二文件,然后按下回车键,两文件同时运行(看起来如此),结果每次test2都被test1给挂了。当然,就算把两个文件的排列顺序颠倒,然后再选取执行结果也是一样,看来文件名占了很大的优势啊。
进而想到在前面的测试中出现平手的情况,只能感慨CMD用在处理循环上的时间实在是太长了。
另:关于循环延时,想起了以前的一个贴子:   从一个GIF文件引起的麻烦

后记:大家无聊的时候都做甚么?有无若willsort兄这般拿CMD来打发时光?老手与新手,高手与菜鸟的区别就是从这里开始的。
鄙视自己一个先,居然无聊的时候打 傲剑狂刀。

2006-6-28 22:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
doscc
中级用户




积分 256
发帖 93
注册 2006-3-26
来自 广东
状态 离线
『第 3 楼』:  

我也ps 一下自己! 有空在手机论坛潜水!
以下这版主的代码:

if 1%time:~6,2% GEQ 157 goto Wait1   rem 为什么用 157 这是自定的吗?
set /a sec=1%time:~6,2%+3   rem 这里我觉得不用加 1 (1%tiem:~6,8%) 吧 ,因为在下面一句  (%sec:~1,2%.00) 把 左边第一个字符去了.
set wartime=%time:~0,6%%sec:~1,2%.00

改后代码:
if 1%time:~6,2% GEQ 157 goto Wait1
set /a sec=%time:~6,2%+3
set wartime=%time:~0,6%%sec%.00
3次运行版主的原代码.都是 test1.cmd 赢! 佩服版主的思路

[ Last edited by doscc on 2006-6-29 at 14:10 ]

2006-6-29 14:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
xiongwei2624
初级用户





积分 96
发帖 44
注册 2006-6-26
来自 深圳
状态 离线
『第 4 楼』:  

比较深奥!还要慢慢研究!

2006-6-29 15:40
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (3099591)  编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 5 楼』:  



  Quote:
if 1%time:~6,2% GEQ 157 goto Wait1   rem 为什么用 157 这是自定的吗?

因为57+3=60

  Quote:
set /a sec=1%time:~6,2%+3   rem 这里我觉得不用加 1 (1%tiem:~6,8%) 吧 ,因为在下面一句  (%sec:~1,2%.00) 把 左边第一个字符去了.

如果时间为08或09呢?
c:\>set /a var=08+1
无效数字。数字常数只能是十进制(17),十六位进制(0x11)或八进制(021)。


2006-7-1 10:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
doscc
中级用户




积分 256
发帖 93
注册 2006-3-26
来自 广东
状态 离线
『第 6 楼』:  

嗯`
谢谢 3742668版主

2006-7-1 11:40
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: