回 帖 发 新 帖 刷新版面

主题:[讨论]闲来无事写了个小程序,可以运行的结果和我想要的不同!来看看

public static void aa()
{
ThreadStart worker=new ThreadStart(WorkerForMe);
Thread t=new Thread(worker);
t.Start();
for(int i=0;i <= 60;i++)
{    
if(i <= 60)
{
Console.WriteLine(i);
Thread.Sleep(1000);
//Console.Clear();
}
else
{
t.Abort();
}
}
Console.ReadLine();
我想要的结果是在输出一个数字累加的效果,但是却变成了输出所有的结果.该怎么实现象跳动的秒钟那样的效果?我想过一种办法,那就是清屏,但是不是怎么写.大家有什么办法,一起讨论讨论.

回复列表 (共6个回复)

沙发

就像原来的\r那样?

板凳

呵呵~~~刚好,前面也有人说怎么清屏问题,有种方法是用\b,我就找了一个关于用API函数来清屏,正准备发的时候才发现已结了。那我就不好意思一下发到这边来喽。

namespace ClsConsoleApplication
{
    // 更好玩的是你还可以调用API FillConsoleOutputAttribute函数来设置屏幕上显示的颜色。

    using System;
    using System.Runtime.InteropServices;

    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Text!\nPlease Input \"y\" or \"n\": ");
            string strInput = string.Empty;
            strInput = Console.ReadLine();
            if (strInput.ToLower() == "y")
            {
                Console.WriteLine("Cls \"Text\" character.");    
                int writted = 0;
                IntPtr m_hCon = GetStdHandle(-11);
                COORD start = new COORD();
                start.x = start.y = 0;
                FillConsoleOutputCharacter(m_hCon, ' ', 1 * 4, start, ref writted);
                //FillConsoleOutputAttribute(m_hCon,
                Console.WriteLine("Cls Success");
            }
            else
            {
                Console.WriteLine("Cls Unsuccess");
            }
            Console.ReadLine();
        }

        [StructLayout(LayoutKind.Sequential)]
        internal struct COORD
        {
            internal short x, y;
        }

        /// <summary>
        /// 获取标准输出的句柄。
        /// -10  这是标准输入
        /// -11  这是标准输出
        /// -12  这是标准错误
        /// </summary>
        /// <param name="nStdHandle">标准句柄代号</param>
        /// <returns></returns>
        [DllImport("KERNEL32", SetLastError = true)]
        internal extern static IntPtr GetStdHandle(int nStdHandle);

        /// <summary>
        /// 调用API函数在屏幕上显示相应字符(不知道这样解释对不对)
        /// </summary>
        /// <param name="Handle">可用GetStdHandle()获取</param>
        /// <param name="uChar">要输出的字符</param>
        /// <param name="Len">长度是按 长*宽 来算的</param>
        /// <param name="start">从哪开始</param>
        /// <param name="writted">写入到屏幕缓存</param>
        /// <returns></returns>
        [DllImport("KERNEL32", SetLastError = true)]
        internal extern static bool FillConsoleOutputCharacter(IntPtr Handle, char uChar, int Len, COORD start, ref int writted);
    }
}

3 楼

试试这个:

public static void aa()
{
ThreadStart worker=new ThreadStart(WorkerForMe);
Thread t=new Thread(worker);
t.Start();
string output;
for(int i=0;i <= 60;i++)
{    
if(i <= 60)
{
output=i.ToString();
Console.Write(output);
Thread.Sleep(1000);
Console.Write(new string('\b',output.Length));
//Console.Clear();
}
else
{
t.Abort();
}
}
Console.ReadLine();

4 楼

和2楼发的时间蛮近的……

使用API也好,使用'\b'也好,中心思路就是清掉那一部分内容

5 楼

呵呵

6 楼

不错当秒钟计时用....

我来回复

您尚未登录,请登录后再回复。点此登录或注册