【问题标题】:Thread should stop but it doesnt线程应该停止但它没有
【发布时间】:2014-08-11 11:57:55
【问题描述】:

所以现在我有了这个:hook 热键和一个正在检查 while 循环的 volatile bool

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();
            }
        }
    }

当我按下第一个热键然后第二个同时绘制 2 个三角形时,它不会关闭第一个绘图。这里有什么问题?

【问题讨论】:

  • 嗯,我没有看到任何循环?你能把它们也贴出来吗?
  • 已编辑 :) 谢谢回复
  • 这是在 UI 线程上调用 Thread.Sleep 的糟糕代码。你想在这里做什么?也许有更适合您的解决方案?
  • 我知道它的糟糕代码...地方(当第一个热键按下 - “写”第一个三角形等......)
  • 为什么要反复画三角形?为什么每行之间会有延迟?

标签: c# multithreading winforms


【解决方案1】:

我希望这是您问题的答案。您应该创建另一个线程,否则这将无法正常工作。但是,我会将布尔值“firstLoop”从 winform 发送到您的另一个线程。我的解决方案不是 100% 正确...

Boolean firstLoop = false;

if (e.KeyChar == 21) //CTRL + SHIFT + U
{
    firstLoop = true

    while (firstLoop == true)
    {        
          SetCursorPos(576, 363);
          Thread.Sleep(50);
          SetCursorPos(650, 363);
          Thread.Sleep(50);
          SetCursorPos(650, 430);
          Thread.Sleep(50);
     }
}
if (e.KeyChar == 9) //CTRL + SHIFT + I
{  
    firstLoop = false;

    while (firstLoop == false)
    {
       SetCursorPos(860, 350);
       Thread.Sleep(50);
       SetCursorPos(890, 350);
       Thread.Sleep(50);
       SetCursorPos(890, 380);
       Thread.Sleep(50);
    }
}

【讨论】:

  • 你是对的,它不正确......你的意思是什么其他线程?谢谢
  • 如果你使用 Thread.Sleep() 整个 winform 被“锁定”。要绕过它,我会在另一个线程中执行循环。只是我的想法
  • 我现在很忙。下面是一些例子
    -How to start with threads
    -invoke
猜你喜欢
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
相关资源
最近更新 更多