我有以下代码: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
和设置一个标志。
LEATH
TA贡献1936条经验 获得超6个赞
这部分代码需要更改,否则您将永远循环:
while(runBot == true)
{
if(processrunning() == true)
{
}
}
也许在处理中将 runbot 设置为 false?
- 2 回答
- 0 关注
- 145 浏览
添加回答
举报
0/150
提交
取消