为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
芜湖不芜 2021-08-22 14:48:35
我有以下代码: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,它将起作用,但是该行会导致冻结。我在这里遗漏了什么?
查看完整描述

2 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

Windows 窗体有一个 UI 线程。该线程负责更新 UI,并处理 UI 相关事件。如果此线程被阻塞,那么您的 UI 将变得无响应。

计时器滴答事件由此 UI 线程处理,因此当您在此事件处理程序中启动一个长循环时,UI 线程无法处理 UI 的其余部分,并且您的程序似乎冻结了。

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

while(runBot == true)

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

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


查看完整回答
反对 回复 2021-08-22
?
LEATH

TA贡献1936条经验 获得超6个赞

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


while(runBot == true)

{

    if(processrunning() == true)

    {

    }

}

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


查看完整回答
反对 回复 2021-08-22
  • 2 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信