C# 近身格斗
有人知道问题出在哪里吗C# 近身格斗,c#,multithreading,winforms,C#,Multithreading,Winforms,有人知道问题出在哪里吗 UserActivityHook actHook; private void Form1_Load(object sender, EventArgs e) { actHook = new UserActivityHook(); actHook.KeyPress += new KeyPressEventHandler(klawisze); actHook.KeyDown += new KeyEventHandler(klawisze2);
UserActivityHook actHook;
private void Form1_Load(object sender, EventArgs e)
{
actHook = new UserActivityHook();
actHook.KeyPress += new KeyPressEventHandler(klawisze);
actHook.KeyDown += new KeyEventHandler(klawisze2);
actHook.Start();
}
public void pw()
{
while (!stopIt)
{
SetCursorPos(576, 363);
Thread.Sleep(50);
SetCursorPos(650, 363);
Thread.Sleep(50);
SetCursorPos(650, 430);
Thread.Sleep(50);
}
}
public void Stop()
{
stopIt = true;
}
private volatile bool stopIt;
public void dw()
{
while (!stopIt)
{
SetCursorPos(860, 350);
Thread.Sleep(50);
SetCursorPos(890, 350);
Thread.Sleep(50);
SetCursorPos(890, 380);
Thread.Sleep(50);
}
}
public void klawisze(object sender, KeyPressEventArgs e)
{
Thread w1 = new Thread(new ThreadStart(pw));
Thread w2 = new Thread(new ThreadStart(dw));
try
{
if (e.KeyChar == 21) //CTRL + SHIFT + U
{ //1
stopIt = false;
w1.Start();
if (e.KeyChar == 9)
{
Stop();
w1.Join();
}
}
if (e.KeyChar == 9) //CTRL + SHIFT + I
{ //2
stopIt = false;
w2.Start();
if (e.KeyChar == 21)
{
Stop();
w2.Join();
}
}
}
当我按第一个热键时,它应该延迟绘制三角形,当我按第二个热键时,它应该延迟绘制第二个三角形(+停止绘制第一个),但它同时绘制两个三角形。。。我搞糊涂了…你的原因
如果
查询它就不可能调用Stop()
或加入一个线程。相反,它将启动一个新线程。而且你的线程是本地的,你总是创建新的线程,所以你不能全局停止它们
if (e.KeyChar == 21)
{
stopIt = false;
w1.Start();
if (e.KeyChar == 9) // How should this work? e.Keychar is 21 if the first query passed
{
// This will never be executed
Stop();
w1.Join();
}
}
编辑:因为你问
private static Thread w1;
private static Thread w2;
public void klawisze(object sender, KeyPressEventArgs e)
{
try
{
if (e.KeyChar == 21) //CTRL + SHIFT + U
{
if (w2 != null)
{
Stop();
w2.Join();
while (w2.IsAlive)
{
Thread.Sleep(100);
}
}
stopIt = false;
w1 = new Thread(new ThreadStart(pw));
w1.Start();
}
if (e.KeyChar == 9) //CTRL + SHIFT + I
{ //2
if (w1 != null)
{
Stop();
w1.Join();
while (w1.IsAlive)
{
Thread.Sleep(100);
}
stopIt = false;
}
w2 = new Thread(new ThreadStart(dw));
w2.Start();
}
}
“klawisze2”是做什么的?我看起来你从来没有停止过你当前的线程,总是创建新的线程。此外,您的ifquery是不可能的,这是一个严重破坏的代码。您有两个线程想要移动光标,但这两个线程都没有很好的获胜机会。第一个if(e.KeyChar==9)语句永远不可能为true,您已经检查它是否为21。所以线程永远不会停止。那么我如何替换它呢?@user3057699我添加了一个可能的解决方案。它可能不完全正确,写在我的手机上,现在可以工作了;)