雕虫小技: 给枯燥的 .Net 控制台程序(字符界面)来点儿心跳 (关于退格 '\b' 的使用)
/*
我写的 Blog 随笔的样例代码绝大部分都是,控制台 Console 程序
里面有一些关于"字符界面"的小技巧,都挺简单的,再次提炼出来,废话不多说了!
都是雕虫小技,见笑:
《给枯燥的 .Net 控制台程序来点儿心跳 (关于退格 '\b' 的使用)》
Java 同理
*/
public class Class1
{
public static bool b; //结束条件
static void Main(string[] args)
{
System.Console.WriteLine("测试1: 直接等待 n = 199 次循环");
Wait(199);
System.Console.WriteLine("\n\n测试2: 等待结束条件: b == true");
// 主程序 开始
b = false;
new System.Threading.Thread(new System.Threading.ThreadStart(DoWait)).Start(); //监视线程: 显示滚动计数器
//以下是耗时的主程序
System.Threading.Thread.Sleep(5 * 1000); //主程序耗时 5 秒
b = true; //主程序 结束
System.Console.WriteLine("\n主程序耗时 5 秒");
}
private static void Wait(int Count)
{
System.Console.Write("在进行第 ");
string bs = ""; //用于记录上次的位数
string s = "";
for (int i = 0; i < Count + 1; i++)
{
s = System.DateTime.Now.ToString();
System.Threading.Thread.Sleep(10); // 10/1000 second
System.Console.Write(bs + "\b\b\b" + i + " 次," + s);
bs = new string('\b', Digits(i) + s.Length + 1); //19 为日期时间字符串长度, 1 是 ","
}
}
private static void DoWait()
{
Wait(ref b); //由委托调用的真正函数
}
private static void Wait(ref bool Flag) //Flag 可在其他线程改
{
System.Console.Write("正在进行第 ");
int i = 0;
string bs = "";
string s = "";
while (!Flag)
{
//System.Threading.Thread.Sleep(1000); // 1 second
s = System.DateTime.Now.ToString();
System.Console.Write(bs + "\b\b\b" + i + " 次," + s);
bs = new string('\b', Digits(i) + s.Length + 1); //19 为日期时间字符串长度, 1 是 ","
i ++;
}
}
static int Digits(int n) //数字所占位数
{
n = System.Math.Abs(n);
n = n/10;
int i = 1;
while (n > 0)
{
n = n/10;
i++;
}
return i;
}
}
我写的 Blog 随笔的样例代码绝大部分都是,控制台 Console 程序
里面有一些关于"字符界面"的小技巧,都挺简单的,再次提炼出来,废话不多说了!
都是雕虫小技,见笑:
《给枯燥的 .Net 控制台程序来点儿心跳 (关于退格 '\b' 的使用)》
Java 同理
*/
public class Class1
{
public static bool b; //结束条件
static void Main(string[] args)
{
System.Console.WriteLine("测试1: 直接等待 n = 199 次循环");
Wait(199);
System.Console.WriteLine("\n\n测试2: 等待结束条件: b == true");
// 主程序 开始
b = false;
new System.Threading.Thread(new System.Threading.ThreadStart(DoWait)).Start(); //监视线程: 显示滚动计数器
//以下是耗时的主程序
System.Threading.Thread.Sleep(5 * 1000); //主程序耗时 5 秒
b = true; //主程序 结束
System.Console.WriteLine("\n主程序耗时 5 秒");
}
private static void Wait(int Count)
{
System.Console.Write("在进行第 ");
string bs = ""; //用于记录上次的位数
string s = "";
for (int i = 0; i < Count + 1; i++)
{
s = System.DateTime.Now.ToString();
System.Threading.Thread.Sleep(10); // 10/1000 second
System.Console.Write(bs + "\b\b\b" + i + " 次," + s);
bs = new string('\b', Digits(i) + s.Length + 1); //19 为日期时间字符串长度, 1 是 ","
}
}
private static void DoWait()
{
Wait(ref b); //由委托调用的真正函数
}
private static void Wait(ref bool Flag) //Flag 可在其他线程改
{
System.Console.Write("正在进行第 ");
int i = 0;
string bs = "";
string s = "";
while (!Flag)
{
//System.Threading.Thread.Sleep(1000); // 1 second
s = System.DateTime.Now.ToString();
System.Console.Write(bs + "\b\b\b" + i + " 次," + s);
bs = new string('\b', Digits(i) + s.Length + 1); //19 为日期时间字符串长度, 1 是 ","
i ++;
}
}
static int Digits(int n) //数字所占位数
{
n = System.Math.Abs(n);
n = n/10;
int i = 1;
while (n > 0)
{
n = n/10;
i++;
}
return i;
}
}