将属性设置为 true 时 C# 软件冻结

我有以下代码:


public partial class Form1 : Form

{

    // our config

    public bool runBot, afkModeToggle, shutdownPcToggle = false;

    public int roundsToPlay, minsToPlay, waitInLobbyFor, waitInDeathScreenFor;


    public void addToLogs(string logmsg)

    {

        richTextBox1.AppendText("\r\n" + logmsg);

        richTextBox1.ScrollToCaret();

    }


    public void startsoftware()

    {

        runBot = true;

        addToLogs("[" + DateTime.Now + "] Bot has started");

        label22.Text = " RUNNING" + runBot;

        label22.ForeColor = System.Drawing.Color.DarkGreen;

    }


    public void pausesoftware()

    {

        runBot = false;

        addToLogs("[" + DateTime.Now + "] Bot has been paused");

        label22.Text = " PAUSED" + runBot;

        label22.ForeColor = System.Drawing.Color.Crimson;


        if (checkBox3.Checked) 

        { 

            Process.Start("shutdown", "/s /t 0");

        }

    }


    public bool processrunning()

    {

        Process[] pname = Process.GetProcessesByName("notepad");

        if (pname.Length == 0)

        {

            label23.Text = "process Not Found";

            label23.ForeColor = System.Drawing.Color.Crimson;

            return false;

        }

        else

        {

            label23.Text = "process Found";

            label23.ForeColor = System.Drawing.Color.DarkGreen;

            return true;

        }

    }


    //

    // form follows

    //


    public Form1()

    {

        InitializeComponent();

    }


    private void timer1_Tick(object sender, EventArgs e)

    {

        while(runBot == true)

        {

            if(processrunning() == true)

            {

            }

        }

    }


    private void button1_Click(object sender, EventArgs e)

    {

        startsoftware();

    }


    private void button2_Click(object sender, EventArgs e)

    {

        pausesoftware();

    }

}

它是通过 Visual Studio 构建的基本形式。当我单击按钮 1 时,它只会冻结软件,而您无法单击其他任何内容。我已经将其追溯到这一点 - 如果我注释掉函数runBot = true内部startsoftware,它将起作用,但是该行会导致冻结。


我在这里遗漏了什么?


芜湖不芜
浏览 146回答 2
2回答

慕桂英4014372

Windows 窗体有一个 UI 线程。该线程负责更新 UI,并处理 UI 相关事件。如果此线程被阻塞,那么您的 UI 将变得无响应。计时器滴答事件由此 UI 线程处理,因此当您在此事件处理程序中启动一个长循环时,UI 线程无法处理 UI 的其余部分,并且您的程序似乎冻结了。有几种方法可以在您的代码中解决此问题。您可能会删除while(runBot == true)从您的计时器滴答事件中,让计时器定期滴答。当您不想processrunning运行检查时,您可以禁用计时器。如果您不希望用户在此期间单击某些内容,您可以禁用按钮。另一种选择是有一个后台线程来相应地调用processrunning和设置一个标志。

LEATH

这部分代码需要更改,否则您将永远循环:while(runBot == true){    if(processrunning() == true)    {    }}也许在处理中将 runbot 设置为 false?
打开App,查看更多内容
随时随地看视频慕课网APP