আমি কীভাবে একটি সি # উইন্ডোজ কনসোল অ্যাপে বর্তমান লাইনটি আপডেট করতে পারি?


507

সি # তে উইন্ডোজ কনসোল অ্যাপ তৈরি করার সময়, কোনও বর্তমান লাইন বাড়ানো বা একটি নতুন লাইনে না গিয়ে কনসোলে কী লেখা সম্ভব? উদাহরণস্বরূপ, আমি যদি প্রক্রিয়াটি সমাপ্ত হওয়ার কত কাছাকাছি প্রতিনিধিত্ব করে এমন একটি শতাংশ দেখাতে চাই, তবে আমি কার্সারের মতো একই লাইনে মানটি আপডেট করতে চাই এবং প্রতিটি শতাংশকে নতুন লাইনে রাখি না।

এটি একটি "স্ট্যান্ডার্ড" সি # কনসোল অ্যাপ্লিকেশন দিয়ে করা যেতে পারে?


আপনি যদি কুল কমান্ড লাইন ইন্টারফেসে সত্যিই আগ্রহী হন তবে আপনার অভিশাপগুলি / এনক্রসগুলি পরীক্ষা করা উচিত।
চার্লস অ্যাডিস

@ চারলেস অ্যাডিস কিন্তু শাপ দেয় না / এনক্রস কেবল সি ++ তে কাজ করে?
Xam

উত্তর:


783

আপনি যদি কেবল "\r"কনসোলে মুদ্রণ করেন তবে কার্সারটি বর্তমান লাইনের শুরুতে ফিরে যায় এবং তারপরে আপনি এটি আবার লিখতে পারেন। এই কৌতুক করতে হবে:

for(int i = 0; i < 100; ++i)
{
    Console.Write("\r{0}%   ", i);
}

আগে যা ছিল তা মুছে ফেলা হয়েছে তা নিশ্চিত করার জন্য সংখ্যার পরে কয়েকটি স্পেস লক্ষ্য করুন। আপনি যেহেতু লাইনের শেষে "\ n" যুক্ত করতে চান না তার পরিবর্তে এর
ব্যবহারটিও লক্ষ্য করুন ।Write()WriteLine()


7
(int i = 0; i <= 100; ++ i) 100%
নিকোলাস টেলার

13
আগের লেখা যখন নতুন লেখার চেয়ে দীর্ঘ ছিল আপনি কীভাবে পরিচালনা করবেন? কনসোলের প্রস্থ পাওয়ার কোনও উপায় আছে এবং স্পেসগুলি দিয়ে রেখাটি প্যাড করতে পারে?
ড্রু চ্যাপিন

6
@ ড্রুসিফেরে আমার মাথার উপরের অংশটি আমি আপনার প্রশ্নের দুটি উত্তর বিবেচনা করতে পারি। তারা উভয়ই বর্তমান আউটপুটটিকে প্রথমে একটি স্ট্রিং হিসাবে সংরক্ষণ করা এবং এটির জন্য নির্দিষ্ট পরিমাণে অক্ষর দিয়ে প্যাড করা জড়িত: কনসোল.উরাইট ("\ r {0}", strOutput.PadRight (nPaddingCount, '')); "এনপ্যাডিংকাউন্ট" এমন একটি সংখ্যা হতে পারে যা আপনি নিজেকে সেট করেছেন বা আপনি আগের আউটপুটটি ট্র্যাক করতে পারেন এবং এনপ্যাডিংকাউন্টটিকে আগের এবং বর্তমান আউটপুট প্লাস বর্তমান আউটপুট দৈর্ঘ্যের মধ্যে পার্থক্য হিসাবে সেট করতে পারেন। যদি এনপ্যাডিংকাউন্টটি নেতিবাচক হয় তবে আপনি প্যাডরাইট ব্যবহার করতে হবে না যদি আপনি অ্যাবস না করেন (prev.len - curr.len)।
জন ওডম

1
@ ম্যালজিএম সুসংহত কোড যদি কোনও ডজন থ্রেডের যে কোনও সময় কনসোলে এটি চাইলে লিখতে পারে তবে আপনি নতুন লাইন লিখছেন বা না লিখুন তা ছাড়াই আপনাকে কষ্ট দেবে।
চিহ্নিত করুন

2
@ জনঅডম আপনাকে কেবল পূর্ববর্তী (আনপ্যাডড) আউটপুট দৈর্ঘ্য রাখতে হবে এবং তারপরে এটিকে প্রথম যুক্তি হিসাবে খাওয়াতে হবে PadRight(অবশ্যই আনপ্যাডেড স্ট্রিং বা দৈর্ঘ্য সংরক্ষণ করতে হবে) অবশ্যই।
জেস্পার ম্যাথিজেন

254

আপনি Console.SetCursorPositionকার্সারের অবস্থান নির্ধারণ করতে এবং তারপরে বর্তমান অবস্থানে লিখতে পারেন।

এখানে একটি সাধারণ "স্পিনার" দেখানোর উদাহরণ রয়েছে :

static void Main(string[] args)
{
    var spin = new ConsoleSpinner();
    Console.Write("Working....");
    while (true) 
    {
        spin.Turn();
    }
}

public class ConsoleSpinner
{
    int counter;

    public void Turn()
    {
        counter++;        
        switch (counter % 4)
        {
            case 0: Console.Write("/"); counter = 0; break;
            case 1: Console.Write("-"); break;
            case 2: Console.Write("\\"); break;
            case 3: Console.Write("|"); break;
        }
        Thread.Sleep(100);
        Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
    }
}

মনে রাখবেন যে আপনাকে যে কোনও বিদ্যমান আউটপুট নতুন আউটপুট বা ফাঁকা দিয়ে ওভাররাইট করতে হবে তা নিশ্চিত করতে হবে।

আপডেট: সমালোচনা করা হয়েছে যে উদাহরণটি কার্সরটিকে কেবল একটি অক্ষর দ্বারা ফিরিয়ে নিয়ে যায়, আমি এটি স্পষ্ট করার জন্য যুক্ত করব: SetCursorPositionআপনাকে ব্যবহার করে কনসোল উইন্ডোতে যে কোনও অবস্থাতে কার্সার সেট করা যেতে পারে।

Console.SetCursorPosition(0, Console.CursorTop);

কার্সারটিকে বর্তমান লাইনের শুরুতে সেট করা হবে (বা আপনি Console.CursorLeft = 0সরাসরি ব্যবহার করতে পারেন )।


8
\ R ব্যবহার করে সমস্যাটি সমাধান হতে পারে, তবে SetCursorPosition(বা CursorLeft) ব্যবহার আরও নমনীয়তার জন্য অনুমতি দেয় যেমন লাইনটির শুরুতে লেখার জন্য না, উইন্ডোতে উঠে যাওয়া ইত্যাদি it সুতরাং এটি আরও সাধারণ পদ্ধতি যা আউটপুট যেমন ব্যবহার করা যেতে পারে কাস্টম অগ্রগতি বার বা ASCII গ্রাফিক।
ডার্ক ভোলমার

14
ভার্বোজ হওয়ার জন্য এবং ডিউটির ডাকের বাইরে এবং বাইরে যাওয়ার জন্য +1। ভাল জিনিস ধন্যবাদ।
কোপাস

1
এটি করার আলাদা উপায় দেখানোর জন্য +1। প্রত্যেকে প্রত্যেকে \ r দেখিয়েছে এবং ওপি যদি কেবল একটি শতাংশ আপডেট করে থাকে তবে এর সাহায্যে তিনি পুরো লাইনটি আবার না লিখে মান আপডেট করতে পারেন। ওপি আসলে কখনই বলেনি যে তিনি লাইনটির শুরুতে যেতে চেয়েছিলেন, ঠিক তেমন যে তিনি কার্সারের মতো একই লাইনে কিছু আপডেট করতে চেয়েছিলেন।
অ্যান্ডি

1
সেটকার্সারপজিশনের যুক্ত নমনীয়তাটি কিছুটা গতি এবং একটি লক্ষণীয় কার্সার ঝাঁকুনির জন্য ব্যয় করে যদি লুপটি ব্যবহারকারীটির জন্য লক্ষ্য করার জন্য যথেষ্ট দীর্ঘ হয়। নীচে আমার পরীক্ষার মন্তব্য দেখুন।
কেভিন

5
এছাড়াও নিশ্চিত করুন যে লাইনের দৈর্ঘ্যের কারণে কনসোলটি পরবর্তী লাইনে মুড়ে যায় না বা যে কোনও উপায়ে কনসোল উইন্ডোতে চলছে এমন বিষয়বস্তু নিয়ে আপনি সমস্যা পেতে পারেন।
ম্যান্ড্রেকে

84

এটি করার জন্য এখন পর্যন্ত আমাদের কাছে তিনটি প্রতিযোগী বিকল্প রয়েছে:

Console.Write("\r{0}   ", value);                      // Option 1: carriage return
Console.Write("\b\b\b\b\b{0}", value);                 // Option 2: backspace
{                                                      // Option 3 in two parts:
    Console.SetCursorPosition(0, Console.CursorTop);   // - Move cursor
    Console.Write(value);                              // - Rewrite
}

আমি সর্বদা ব্যবহার করেছি Console.CursorLeft = 0, তৃতীয় বিকল্পের একটি বৈচিত্র, তাই আমি কিছু পরীক্ষা করার সিদ্ধান্ত নিয়েছি। আমি যে কোডটি ব্যবহার করেছি তা এখানে:

public static void CursorTest()
{
    int testsize = 1000000;

    Console.WriteLine("Testing cursor position");
    Stopwatch sw = new Stopwatch();
    sw.Start();
    for (int i = 0; i < testsize; i++)
    {
        Console.Write("\rCounting: {0}     ", i);
    }
    sw.Stop();
    Console.WriteLine("\nTime using \\r: {0}", sw.ElapsedMilliseconds);

    sw.Reset();
    sw.Start();
    int top = Console.CursorTop;
    for (int i = 0; i < testsize; i++)
    {
        Console.SetCursorPosition(0, top);        
        Console.Write("Counting: {0}     ", i);
    }
    sw.Stop();
    Console.WriteLine("\nTime using CursorLeft: {0}", sw.ElapsedMilliseconds);

    sw.Reset();
    sw.Start();
    Console.Write("Counting:          ");
    for (int i = 0; i < testsize; i++)
    {        
        Console.Write("\b\b\b\b\b\b\b\b{0,8}", i);
    }

    sw.Stop();
    Console.WriteLine("\nTime using \\b: {0}", sw.ElapsedMilliseconds);
}

আমার মেশিনে, আমি নিম্নলিখিত ফলাফলগুলি পেয়েছি:

  • ব্যাকস্পেস: 25.0 সেকেন্ড
  • ক্যারেজ রিটার্নস: 28.7 সেকেন্ড
  • সেটকার্সার অবস্থান: 49.7 সেকেন্ড

অতিরিক্তভাবে, SetCursorPositionলক্ষণীয় ঝাঁকুনির কারণে আমি বিকল্পগুলির সাথে কোনটি পর্যবেক্ষণ করি নি। সুতরাং, নৈতিকটি হ'ল সম্ভব হলে ব্যাকস্পেস বা গাড়ীর ফেরত ব্যবহার করা এবং আমাকে এটির দ্রুততর উপায় শেখানোর জন্য ধন্যবাদ , তাই!


আপডেট : মন্তব্যে, জোল পরামর্শ দেয় যে সেট পদ্ধতিগুলি অন্য পদ্ধতিগুলি লিনিয়ার থাকাকালীন সরানো দূরত্বের বিষয়ে ধ্রুবক। পরবর্তী পরীক্ষা নিশ্চিত করে যে এটি ক্ষেত্রে এটি তবে ধ্রুবক সময় এবং ধীর এখনও ধীর। আমার পরীক্ষাগুলিতে, কনসোলটিতে ব্যাকস্পেসের দীর্ঘ স্ট্রিং লেখা কোথাও প্রায় 60 টি অক্ষর না হওয়া পর্যন্ত সেটকার্সর অবস্থানের চেয়ে দ্রুত। সুতরাং ব্যাকস্পেসটি 60 টির চেয়ে কম অক্ষরের (বা তাই) লাইনের অংশগুলি প্রতিস্থাপনের জন্য দ্রুত এবং এটি ঝাঁকুনি দেয় না, তাই আমি initial b ওভার \ আর এর প্রাথমিক অনুমোদনের পাশে দাঁড়াতে যাচ্ছি SetCursorPosition


4
প্রশ্নে অভিযানের দক্ষতার বিষয়টি গুরুত্বপূর্ণ নয়। এটি ব্যবহারকারীর লক্ষ্য করার জন্য খুব দ্রুত ঘটতে হবে। অপ্রয়োজনীয় মাইক্রোপটিমাইজেশন খারাপ।
ম্যালফিস্ট

@ মালফিস্ট: লুপের দৈর্ঘ্যের উপর নির্ভর করে, ব্যবহারকারী লক্ষ্য করতে পারে বা নাও পারে। আমি উপরের সম্পাদনাটিতে যোগ করার সাথে সাথে (আমি আপনার মন্তব্য দেখার আগে), সেটকার্সারপ্লেস ফ্লিকারটি চালু করে এবং অন্যান্য বিকল্পগুলির চেয়ে প্রায় দ্বিগুণ সময় নেয়।
কেভিন

1
আমি সম্মতি দিচ্ছি যে এটি একটি মাইক্রো-অপ্টিমাইজেশন (এটি মিলিয়ন বার চালানো এবং 50 সেকেন্ড সময় নেওয়া এখনও খুব অল্প সময়ের মধ্যে), ফলাফলগুলির জন্য +1 এবং এটি জেনে রাখা অবশ্যই কার্যকরভাবে কার্যকর হতে পারে।
অ্যান্ডি

6
মাপদণ্ডটি মূলত ত্রুটিযুক্ত। এটি সম্ভব যে কার্সার যত দূরে সরে যায় সে ক্ষেত্রে সেটকার্সারপজিশন () সময় সমান হয়, অন্য কনসোলে কতগুলি অক্ষর প্রক্রিয়া করতে হয় তার অন্যান্য বিকল্পগুলি পরিবর্তিত হয়।
জোয়েল কোহোর্ন

1
এটি উপলব্ধ বিভিন্ন বিকল্পের একটি খুব সুন্দর যোগফল। যাইহোক, আমি using r ব্যবহার করার সময় ঝাঁকুনি দেখি। With বি দিয়ে স্পষ্টত কোনও ঝাঁকুনি নেই কারণ ফিক্স পাঠ্য ("গণনা:") পুনরায় লেখা হয়নি। আপনি অতিরিক্ত \ বি যুক্ত করলে এবং text বি এবং সেটকার্সারপজিশনের সাথে ঠিকঠাক পাঠ্যটি পুনরায় লিখলে আপনিও ঝাঁকুনি পাবেন। জোয়েলের মন্তব্য সম্পর্কিত: জোয়েল মূলত সঠিক, তবে \ r এখনও খুব দীর্ঘ লাইনে সেটকার্সার অবস্থানকে ছাড়িয়ে যাবে তবে তফাতটি কম হবে।
ডার্ক ভোলমার

27

আপনি বর্তমান লাইনে একটি নির্দিষ্ট সংখ্যক অক্ষরের ব্যাকআপ নিতে \ b (ব্যাকস্পেস) এস্কেপ ক্রম ব্যবহার করতে পারেন । এটি কেবল বর্তমান অবস্থানটি সরিয়ে দেয়, এটি অক্ষরগুলি সরিয়ে দেয় না।

উদাহরণ স্বরূপ:

string line="";

for(int i=0; i<100; i++)
{
    string backup=new string('\b',line.Length);
    Console.Write(backup);
    line=string.Format("{0}%",i);
    Console.Write(line);
}

এখানে, লাইনটি কনসোলে লিখার শতাংশ লাইন। কৌশলটি হ'ল পূর্ববর্তী আউটপুটটির জন্য number b অক্ষরের সঠিক সংখ্যা উত্পন্ন করা ।

Approach r পদ্ধতির মাধ্যমে এর সুবিধাটি হ'ল যদি আপনার শতাংশের আউটপুট লাইনের শুরুতে না হয় তবেও যদি এটি কাজ করে।


1
+1, এটি উপস্থাপিত দ্রুততম পদ্ধতি হিসাবে প্রমাণিত হয়েছে (নীচে আমার পরীক্ষার মন্তব্য দেখুন)
কেভিন

19

\rএই পরিস্থিতিতে জন্য ব্যবহৃত হয়।
\r একটি ক্যারেজ রিটার্ন উপস্থাপন করে যার অর্থ কার্সারটি লাইনের শুরুতে ফিরে আসে।
এজন্য উইন্ডোজ \n\rতার নতুন লাইন চিহ্নিতকারী হিসাবে ব্যবহার করে ।
\nআপনাকে একটি রেখায় নামিয়ে দেয় এবং \rআপনাকে লাইনের শুরুতে ফিরিয়ে দেয়।


22
এটি বাদে আসলে \ r \ n।
জোয়েল মুয়েলার

14

আমাকে শুধু ডিভো ConsoleSpinnerক্লাস নিয়ে খেলতে হয়েছিল । খনি সংক্ষিপ্ত হিসাবে কোথাও নেই, তবে এটি কেবল আমার সাথে ভালভাবে বসেনি যে এই শ্রেণীর ব্যবহারকারীদের তাদের নিজস্ব while(true)লুপ লিখতে হবে । আমি আরও একটি অভিজ্ঞতার জন্য শুটিং করছি:

static void Main(string[] args)
{
    Console.Write("Working....");
    ConsoleSpinner spin = new ConsoleSpinner();
    spin.Start();

    // Do some work...

    spin.Stop(); 
}

এবং আমি এটি নীচের কোড দিয়ে উপলব্ধি করেছি। যেহেতু আমি আমার Start()পদ্ধতিটি ব্লক করতে চাই না, তাই আমি চাই না যে ব্যবহারকারীকে একটি পছন্দ while(spinFlag)মতো লুপ লেখার বিষয়ে চিন্তা করা উচিত এবং আমি একই সাথে একাধিক স্পিনারকেও পরিচালনা করতে চাই যাতে আমি একটি পৃথক থ্রেড পরিচালনা করতে পারি ঘূর্ণায়মান। এবং এর অর্থ কোডটি আরও অনেক জটিল হতে হবে।

এছাড়াও, আমি এতটা মাল্টি-থ্রেডিং করিনি তাই এটি সম্ভব (সম্ভবত এমনকি) যে আমি একটি সূক্ষ্ম বাগ বা তিনটি সেখানে রেখেছি। তবে এটি এখন পর্যন্ত বেশ ভালভাবে কাজ করছে বলে মনে হচ্ছে:

public class ConsoleSpinner : IDisposable
{       
    public ConsoleSpinner()
    {
        CursorLeft = Console.CursorLeft;
        CursorTop = Console.CursorTop;  
    }

    public ConsoleSpinner(bool start)
        : this()
    {
        if (start) Start();
    }

    public void Start()
    {
        // prevent two conflicting Start() calls ot the same instance
        lock (instanceLocker) 
        {
            if (!running )
            {
                running = true;
                turner = new Thread(Turn);
                turner.Start();
            }
        }
    }

    public void StartHere()
    {
        SetPosition();
        Start();
    }

    public void Stop()
    {
        lock (instanceLocker)
        {
            if (!running) return;

            running = false;
            if (! turner.Join(250))
                turner.Abort();
        }
    }

    public void SetPosition()
    {
        SetPosition(Console.CursorLeft, Console.CursorTop);
    }

    public void SetPosition(int left, int top)
    {
        bool wasRunning;
        //prevent other start/stops during move
        lock (instanceLocker)
        {
            wasRunning = running;
            Stop();

            CursorLeft = left;
            CursorTop = top;

            if (wasRunning) Start();
        } 
    }

    public bool IsSpinning { get { return running;} }

    /* ---  PRIVATE --- */

    private int counter=-1;
    private Thread turner; 
    private bool running = false;
    private int rate = 100;
    private int CursorLeft;
    private int CursorTop;
    private Object instanceLocker = new Object();
    private static Object console = new Object();

    private void Turn()
    {
        while (running)
        {
            counter++;

            // prevent two instances from overlapping cursor position updates
            // weird things can still happen if the main ui thread moves the cursor during an update and context switch
            lock (console)
            {                  
                int OldLeft = Console.CursorLeft;
                int OldTop = Console.CursorTop;
                Console.SetCursorPosition(CursorLeft, CursorTop);

                switch (counter)
                {
                    case 0: Console.Write("/"); break;
                    case 1: Console.Write("-"); break;
                    case 2: Console.Write("\\"); break;
                    case 3: Console.Write("|"); counter = -1; break;
                }
                Console.SetCursorPosition(OldLeft, OldTop);
            }

            Thread.Sleep(rate);
        }
        lock (console)
        {   // clean up
            int OldLeft = Console.CursorLeft;
            int OldTop = Console.CursorTop;
            Console.SetCursorPosition(CursorLeft, CursorTop);
            Console.Write(' ');
            Console.SetCursorPosition(OldLeft, OldTop);
        }
    }

    public void Dispose()
    {
        Stop();
    }
}

নমুনা কোডটি আমার না হলেও সুন্দর পরিবর্তন ification এটি ব্র্যাড আব্রামসের ব্লগ থেকে নেওয়া হয়েছে (আমার উত্তরের লিঙ্কটি দেখুন)। আমি মনে করি এটি স্রেফ একটি সহজ নমুনা হিসাবে সেটকার্সর অবস্থান প্রদর্শন করে লেখা হয়েছে। বিটিডব্লিউ, আমি যা ভাবলাম তা কেবল একটি সাধারণ নমুনা যা নিয়ে আলোচনা শুরু হয়েছিল আমি অবশ্যই অবাক হয়েছি (ইতিবাচক উপায়ে)। সে কারণেই আমি এই সাইটটিকে ভালবাসি :-)
ডার্ক ভোলমার

4

সুস্পষ্টভাবে লাইনের শুরুতে ক্যারেজ রিটার্ন (\ r) ব্যবহার করার পরিবর্তে (স্পষ্ট বা স্পষ্টভাবে) নতুন লাইনের (\ n) ব্যবহার না করে আপনি যা চান তা পাওয়া উচিত। উদাহরণ স্বরূপ:

void demoPercentDone() {
    for(int i = 0; i < 100; i++) {
        System.Console.Write( "\rProcessing {0}%...", i );
        System.Threading.Thread.Sleep( 1000 );
    }
    System.Console.WriteLine();    
}

-1, প্রশ্নটি সি # এর জন্য জিজ্ঞাসা করে, আমি এটি সি # তে আবারও
লিখি

এটি আপনার সি # এফ # এ পরিবর্তন করার পরিবর্তে এটি সম্পাদনার দ্বন্দ্বের মতো দেখাচ্ছে। তাঁর পরিবর্তনটি আপনার এক মিনিট পরে, এবং স্প্রিন্টেফের উপর ফোকাস করেছিল।
অ্যান্ডি

সম্পাদনার জন্য ধন্যবাদ। আমি জিনিসগুলি পরীক্ষা করতে F # ইন্টারেক্টিভ মোড ব্যবহার করার প্রবণতা পেয়েছি এবং গুরুত্বপূর্ণ অংশগুলি পেয়েছি বিসিএল কলগুলি, যা সি # তে একই।
জেমস হুগার্ড

3
    public void Update(string data)
    {
        Console.Write(string.Format("\r{0}", "".PadLeft(Console.CursorLeft, ' ')));
        Console.Write(string.Format("\r{0}", data));
    }

1

এমএসডিএন-তে কনসোল ডক্স থেকে:

আপনি এই সমস্যাটি সমাধান করতে পারেন টেক্সট রাইটার.নিউইলাইন সম্পত্তি আউট বা ত্রুটিযুক্ত সম্পত্তিটিকে অন্য লাইনের সমাপ্তির স্ট্রিংয়ে সেট করে। উদাহরণস্বরূপ, সি # বিবৃতি, কনসোল.এরর.নিউলাইন = "\ r \ n \ r \ n";, স্ট্যান্ডার্ড ত্রুটি আউটপুট স্ট্রিমের জন্য লাইন টার্মিনেশন স্ট্রিংটিকে দুটি ক্যারেজ রিটার্ন এবং লাইন ফিডের অনুক্রমগুলিতে সেট করে। তারপরে আপনি স্পষ্টভাবে ত্রুটি আউটপুট স্ট্রিম অবজেক্টের রাইটলাইন পদ্ধতিটি কল করতে পারবেন, যেমন সি # বিবৃতিতে, কনসোল.আরআরআর.আরাইটলাইন ();

সুতরাং - আমি এটি করেছি:

Console.Out.Newline = String.Empty;

তারপরে আমি নিজেই আউটপুট নিয়ন্ত্রণ করতে সক্ষম;

Console.WriteLine("Starting item 1:");
    Item1();
Console.WriteLine("OK.\nStarting Item2:");

সেখানে যাওয়ার আরও একটি উপায়।


আপনি ঠিক একই উদ্দেশ্যে Console.Write () ব্যবহার করতে পারে ... NEWLINE সম্পত্তি redefining ছাড়াই
Radosław মিদি-পিরেনে

1

আপনি যদি জেনারেটিং ফাইলগুলি দুর্দান্ত দেখতে চান তবে এটি কাজ করে।

                int num = 1;
                var spin = new ConsoleSpinner();
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write("");
                while (true)
                {
                    spin.Turn();
                    Console.Write("\r{0} Generating Files ", num);
                    num++;
                }

এবং এই পদ্ধতিটি যা আমি নীচে কিছু উত্তর পেয়েছি এবং এটি পরিবর্তন করেছি

public class ConsoleSpinner
    {
        int counter;

        public void Turn()
        {
            counter++;
            switch (counter % 4)
            {
                case 0: Console.Write("."); counter = 0; break;
                case 1: Console.Write(".."); break;
                case 2: Console.Write("..."); break;
                case 3: Console.Write("...."); break;
                case 4: Console.Write("\r"); break;
            }
            Thread.Sleep(100);
            Console.SetCursorPosition(23, Console.CursorTop);
        }
    }

0

এখানে অন্য একটি: ডি

class Program
{
    static void Main(string[] args)
    {
        Console.Write("Working... ");
        int spinIndex = 0;
        while (true)
        {
            // obfuscate FTW! Let's hope overflow is disabled or testers are impatient
            Console.Write("\b" + @"/-\|"[(spinIndex++) & 3]);
        }
    }
}

0

আপনি যদি একটি লাইন আপডেট করতে চান তবে তথ্যটি একটি লাইনে দেখানোর জন্য খুব দীর্ঘ, এটির জন্য কিছু নতুন লাইন লাগতে পারে। আমি এই সমস্যার মুখোমুখি হয়েছি এবং নীচে এটি সমাধানের এক উপায়।

public class DumpOutPutInforInSameLine
{

    //content show in how many lines
    int TotalLine = 0;

    //start cursor line
    int cursorTop = 0;

    // use to set  character number show in one line
    int OneLineCharNum = 75;

    public void DumpInformation(string content)
    {
        OutPutInSameLine(content);
        SetBackSpace();

    }
    static void backspace(int n)
    {
        for (var i = 0; i < n; ++i)
            Console.Write("\b \b");
    }

    public  void SetBackSpace()
    {

        if (TotalLine == 0)
        {
            backspace(OneLineCharNum);
        }
        else
        {
            TotalLine--;
            while (TotalLine >= 0)
            {
                backspace(OneLineCharNum);
                TotalLine--;
                if (TotalLine >= 0)
                {
                    Console.SetCursorPosition(OneLineCharNum, cursorTop + TotalLine);
                }
            }
        }

    }

    private void OutPutInSameLine(string content)
    {
        //Console.WriteLine(TotalNum);

        cursorTop = Console.CursorTop;

        TotalLine = content.Length / OneLineCharNum;

        if (content.Length % OneLineCharNum > 0)
        {
            TotalLine++;

        }

        if (TotalLine == 0)
        {
            Console.Write("{0}", content);

            return;

        }

        int i = 0;
        while (i < TotalLine)
        {
            int cNum = i * OneLineCharNum;
            if (i < TotalLine - 1)
            {
                Console.WriteLine("{0}", content.Substring(cNum, OneLineCharNum));
            }
            else
            {
                Console.Write("{0}", content.Substring(cNum, content.Length - cNum));
            }
            i++;

        }
    }

}
class Program
{
    static void Main(string[] args)
    {

        DumpOutPutInforInSameLine outPutInSameLine = new DumpOutPutInforInSameLine();

        outPutInSameLine.DumpInformation("");
        outPutInSameLine.DumpInformation("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");


        outPutInSameLine.DumpInformation("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
        outPutInSameLine.DumpInformation("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");

        //need several lines
        outPutInSameLine.DumpInformation("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
        outPutInSameLine.DumpInformation("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");

        outPutInSameLine.DumpInformation("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
        outPutInSameLine.DumpInformation("bbbbbbbbbbbbbbbbbbbbbbbbbbb");

    }
}

0

আমি vb.net এ একই সমাধান খুঁজছিলাম এবং আমি এটি খুঁজে পেয়েছি এবং এটি দুর্দান্ত।

তবে @ জনডম শূন্যস্থানগুলি হ্যান্ডেল করার আরও ভাল উপায়ের পরামর্শ দিলে যদি আগেরটি বর্তমানের চেয়ে বড় হয় ..

আমি vb.net এ একটি ফাংশন করি এবং ভেবেছিলাম যে কেউ সাহায্য পেতে পারে ..

এখানে আমার কোড:

Private Sub sPrintStatus(strTextToPrint As String, Optional boolIsNewLine As Boolean = False)
    REM intLastLength is declared as public variable on global scope like below
    REM intLastLength As Integer
    If boolIsNewLine = True Then
        intLastLength = 0
    End If
    If intLastLength > strTextToPrint.Length Then
        Console.Write(Convert.ToChar(13) & strTextToPrint.PadRight(strTextToPrint.Length + (intLastLength - strTextToPrint.Length), Convert.ToChar(" ")))
    Else
        Console.Write(Convert.ToChar(13) & strTextToPrint)
    End If
    intLastLength = strTextToPrint.Length
End Sub

এখানে আপনি একটি স্থানীয় স্ট্যাটিক ভেরিয়েবলের ভিবি বৈশিষ্ট্য ব্যবহার করতে পারেন: Static intLastLength As Integer
মার্ক হার্ট

0

আমি এটি লিখেছিলাম যে সমাধানটি আমার লেখা সমাধানটি গতির জন্য অনুকূলিত হতে পারে কিনা তা দেখার জন্য search আমি যা চেয়েছিলাম তা কেবল বর্তমান লাইনের আপডেট না করে কাউন্টডাউন টাইমার ছিল। আমি যা নিয়ে এসেছি তা এখানে। কারও কাজে লাগতে পারে

            int sleepTime = 5 * 60;    // 5 minutes

            for (int secondsRemaining = sleepTime; secondsRemaining > 0; secondsRemaining --)
            {
                double minutesPrecise = secondsRemaining / 60;
                double minutesRounded = Math.Round(minutesPrecise, 0);
                int seconds = Convert.ToInt32((minutesRounded * 60) - secondsRemaining);
                Console.Write($"\rProcess will resume in {minutesRounded}:{String.Format("{0:D2}", -seconds)} ");
                Thread.Sleep(1000);
            }
            Console.WriteLine("");

0

@ ই.লাহু সমাধান দ্বারা অনুপ্রাণিত, শতাংশ সহ একটি বার অগ্রগতি বাস্তবায়ন।

public class ConsoleSpinner
{
    private int _counter;

    public void Turn(Color color, int max, string prefix = "Completed", string symbol = "■",int position = 0)
    {
        Console.SetCursorPosition(0, position);
        Console.Write($"{prefix} {ComputeSpinner(_counter, max, symbol)}", color);
        _counter = _counter == max ? 0 : _counter + 1;
    }

    public string ComputeSpinner(int nmb, int max, string symbol)
    {
        var spinner = new StringBuilder();
        if (nmb == 0)
            return "\r ";

        spinner.Append($"[{nmb}%] [");
        for (var i = 0; i < max; i++)
        {
            spinner.Append(i < nmb ? symbol : ".");
        }

        spinner.Append("]");
        return spinner.ToString();
    }
}


public static void Main(string[] args)
    {
        var progressBar= new ConsoleSpinner();
        for (int i = 0; i < 1000; i++)
        {
            progressBar.Turn(Color.Aqua,100);
            Thread.Sleep(1000);
        }
    }

0

এস সুস এবং 0 এক্সএ 3 এর উত্তরগুলি আমার এখানে দেওয়া। স্পিনার আপডেট করার সময় এটি ব্যবহারকারীর বার্তাগুলি সহ কনসোল আপডেট করতে পারে এবং পাশাপাশি একটি অতিবাহিত সময় সূচক থাকে।

public class ConsoleSpiner : IDisposable
{
    private static readonly string INDICATOR = "/-\\|";
    private static readonly string MASK = "\r{0} {1:c} {2}";
    int counter;
    Timer timer;
    string message;

    public ConsoleSpiner() {
        counter = 0;
        timer = new Timer(200);
        timer.Elapsed += TimerTick;
    }

    public void Start() {
        timer.Start();
    }

    public void Stop() {
        timer.Stop();
        counter = 0;
    }

    public string Message {
        get { return message; }
        set { message = value; }
    }

    private void TimerTick(object sender, ElapsedEventArgs e) {
        Turn();
    }

    private void Turn() {
        counter++;
        var elapsed = TimeSpan.FromMilliseconds(counter * 200);
        Console.Write(MASK, INDICATOR[counter % 4], elapsed, this.Message);
    }

    public void Dispose() {
        Stop();
        timer.Elapsed -= TimerTick;
        this.timer.Dispose();
    }
}

ব্যবহার এই জাতীয় কিছু:

class Program
{
    static void Main(string[] args)
    {
        using (var spinner = new ConsoleSpiner())
        {
            spinner.Start();
            spinner.Message = "About to do some heavy staff :-)"
            DoWork();
            spinner.Message = "Now processing other staff".
            OtherWork();
            spinner.Stop();
        }
        Console.WriteLine("COMPLETED!!!!!\nPress any key to exit.");

    }
}

-1

SetCursorPositionপদ্ধতি মাল্টি থ্রেডিং দৃশ্যকল্প, যেখানে অন্য দুটি পদ্ধতি না কাজ করে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.