我有以下代码:
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
,它将起作用,但是由于该行而导致冻结。
我在这里想念东西吗?
答案 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?