【问题标题】:How to run two while loops?如何运行两个while循环?
【发布时间】:2019-12-29 18:36:15
【问题描述】:

我对 C# 和一般编码还很陌生,所以我很难解释 这可能很简单。

我正在尝试更改游戏中的值的程序(Assault Cube)。

没有内部while循环,它只是改变值,我希望它们循环。

我有一个外部 while 循环,内部有多个循环。 内部 while 循环用于循环函数,但它会停止外部 while 循环。 我希望多个内部循环与外部循环一起运行。

我已经尝试过一切感觉。我尝试了布尔值、中断、返回。 但我没有尝试过解决我的问题。可能不是因为它们不起作用,可能只是我用错了。

        while (true) //outer loop
        {

            Console.Title = "SlavScripts";

            int address1 = LocalPlayer + Health;

            int address2 = LocalPlayer + Armor;

            string Player = "";

            Console.WriteLine("---SlavScripts v2.0---");
            Console.WriteLine("");
            Console.WriteLine("[1] Player Options");
            Console.WriteLine("");

            string answer = "";
            answer = Console.ReadLine();


            if (answer == "1")
            {
                Console.WriteLine("--Player Options--");
                Console.WriteLine("");
                Console.WriteLine("[1] Godmode");
                Console.WriteLine("[2] Armor");
                Console.WriteLine("");
                Player = Console.ReadLine();

                if (Player == "1")
                {
                    Console.WriteLine("Godmode Enabled");
                    Console.WriteLine("");
                    while (true)
                    {
                        vam.WriteInt32((IntPtr)address1, 6969); //value to loop.
                    }
                }
                else if (Player == "2")
                {
                    Console.WriteLine("Infinite Armor Enabled");
                    Console.WriteLine("");
                    while (true)
                    {
                        vam.WriteInt32((IntPtr)address2, 6969); //value to loop.
                    }
                }
            }
        }

(完整代码:https://pastebin.com/bBcBPYs6

预期:

  1. 我输入对应的数字激活功能
  2. 被激活的功能循环,并出现原始文本,允许我导航到另一个功能。

实际:

  1. 我输入相应的数字来激活该功能。
  2. 该函数激活并循环,但不显示开始文本并且不允许我继续输入。

【问题讨论】:

  • 如果您的目标是在拥有命令行控件的同时不断地在某处写入内存,那么您将需要多线程
  • @Ted Brownlow 会调查的。谢谢!

标签: c#


【解决方案1】:

感谢所有回复的人!

多线程听起来比实际困难得多,而且它也大大简化了我的代码!

还是要加Thread.Sleep的:D

干杯!

新增和改进 - pastebin.com/qN7ci0By

【讨论】:

    【解决方案2】:

    如您所愿, 请找到用于连续获取用户输入的示例代码 sn-p - 使用 C# 中的 Task 实现:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
     namespace SampleTaskStop
    {
    
    class Program
    {
        static public void SetValue(string address, int value)
        {
            while (!_cancelled)
            {
                //vam.WriteInt32((IntPtr)address1, 6969); //value to loop.
            }
            Console.WriteLine(address + " - completed");
        }
    
        static bool _cancelled = false;
        static void Main(string[] args)
        {
            while (true) //outer loop
            {
                Console.Title = "SlavScripts";
    
                Console.WriteLine("---SlavScripts v2.0---");
                Console.WriteLine("");
                Console.WriteLine("[1] Player Options");
                Console.WriteLine("");
    
                string answer = "";
                answer = Console.ReadLine();
                _cancelled = false;
    
                if (answer == "1")
                {
                    var acceptUserInput = Task.Factory.StartNew(AcceptUserInput);
                    acceptUserInput.Wait();
                }
            }
        }
    
        private static void AcceptUserInput()
        {
            // Task to perform the value setting in the
            Task computationTask = null;
            Console.WriteLine("Enter Player Input");
            Console.WriteLine("1 God Mode");
            Console.WriteLine("2 Armour Mode");
            Console.WriteLine("Press Esc to cancel");
    
            var key = Console.ReadKey(true);
    
            while (key.Key != ConsoleKey.Escape)
            {
                if (key.Key == ConsoleKey.D1 || key.Key == ConsoleKey.NumPad1 )
                {
                    Console.WriteLine("Godmode Enabled");
                    Console.WriteLine("");
    
                    _cancelled = true;
                    if (computationTask != null)
                    {
                        computationTask.Wait(new System.Threading.CancellationToken());
                    }
                    _cancelled = false;
    
                    computationTask = Task.Factory.StartNew(() => SetValue("data1", 6979));
                }
                else if (key.Key == ConsoleKey.D2 || key.Key == ConsoleKey.NumPad2)
                {
                    Console.WriteLine("Infinite Armor Enabled");
                    Console.WriteLine("");
                    _cancelled = true;
    
                    if (computationTask != null)
                    {
                        computationTask.Wait(new System.Threading.CancellationToken());
                    }
                    _cancelled = false;
    
                    computationTask = Task.Factory.StartNew(() => SetValue("data2", 6979));
                }
    
                key = Console.ReadKey(true);
            }
            _cancelled = true;
            Console.Write("Computation was cancelled");
        }
    }
    

    }

    【讨论】:

    • 请在此处找到参考:stackoverflow.com/a/5068580/2932057
    • 建议使用 Task.Run 而不是 Task.Factory.StartNew
    • @ckuri - 将来肯定会实现Task.Run 而不是Task.Factory.StartNew。以前,我不知道。感谢您的信息
    【解决方案3】:

    想想你的代码中发生了什么。代码中的每条指令一个接一个地执行(表面上认为——这在程序集执行级别可能并不完全正确,但你明白了)。例如,if (answer == "1") 行只有在其前面的行(即answer = Console.ReadLine();)完成执行时才会执行。

    当您创建“外部 while 循环”(如您所称)时,循环内的所有内容都将按照写入顺序一次执行 1 条指令,当执行循环内的最后一条指令时,执行将跳转回到循环内的第一行代码。

    如果您将另一个 while 循环放在“外部循环”内,并说它不会有退出条件(通过声明 while(true) 您正在创建一个从不停止执行的循环其嵌入式语句)。因此,当执行到达这些while(true) 循环之一时,它将被困在其中,永远循环其嵌入的语句。

    我描述的是指令是如何执行的。你需要知道的另一部分是什么是thread。您可以将thread 视为一个独立的机器其中 执行每个代码。当你不直接在代码中处理线程时,编译器会自动要求操作系统创建一个线程来运行你的代码——这通常被称为main thread

    因此,您在代码中真正需要的是通知操作系统将每个“内部while(true)”循环的执行放在主线程以外的线程中,并让主线程仅执行可以顺序执行的代码。

    您可以了解如何在您的应用程序中使用线程here

    附带说明:这可能不是您想要在每个循环中创建循环旋转代码的内容。您应该考虑暂停那些“内部循环”中的执行,方法是让正在执行它的线程在每次迭代时休眠一段时间(您可以通过调用 System.Threading.Thread.Sleep(100) 来做到这一点 - 它会通过 @ 暂停线程执行987654332@ 毫秒,将节省一些 cpu 执行时间)。

    【讨论】:

    • 谢谢!这个答案很有帮助,我正在对多线程进行一些研究。
    猜你喜欢
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 2019-03-08
    相关资源
    最近更新 更多