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

时间:2018-06-19 17:42:20

标签: c# class properties freeze

我有以下代码:

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构建的基本表单。当我单击button1时,它只会冻结软件,而您无法单击其他任何东西。我已将其追溯到这一点-如果我在runBot = true函数中注释掉startsoftware,它将起作用,但是由于该行而导致冻结。

我在这里想念东西吗?

2 个答案:

答案 0 :(得分:0)

Windows窗体具有UI线程。该线程负责更新UI,并处理与UI相关的事件。如果此线程曾经被阻塞,则您的UI将无响应。

计时器滴答事件是由此UI线程处理的,因此,当您在此事件处理程序内启动长循环时,UI线程将无法处理其余的UI,并且程序似乎会冻结。

有几种方法可以在代码中解决此问题。您可以删除

while(runBot == true)

从您的计时器滴答事件开始,并让计时器定期滴答。当您不希望运行processrunning时可以禁用计时器。  如果您不希望用户在此期间单击某些内容,则可以禁用按钮。

另一种选择是让一个后台线程调用processrunning并相应地设置一个标志。

答案 1 :(得分:-1)

这部分代码需要更改,否则您将永远循环:

while(runBot == true)
{
    if(processrunning() == true)
    {
    }
}

也许在处理过程中将runbot设置为false?