2012-04-26 178 views
0

我无法停止KeyListener函数中的while循环。 Timer函数每10秒钟声明Activefalse。但KeyListener函数中的while循环仍然在运行。通过使用线程停止while循环C++

我想不通为什么循环继续运行;每个周期它应测试Active是否为真,如果不是(因为在10秒后应该关闭),则循环不应该运行。但它确实如此。

void KeyListener(bool Active) 
{ 
    cout << Active << endl; //debug 
    while (Active==true){ 
     cout << "loop still running." << endl; //debug 
     Sleep(100); 
     for (int i=8;i<=190;i++){ 
      if (GetAsyncKeyState(i) == -32767){ 
       KeyWrite(i); // (turns the numbers into characters) 
      }  
     } 
    } 
} 

void Timer(void* pParams){ 
    while (true){ 
     Sleep(10000); 
     KeyListener(false); // Active = false 
     cout << "KeyListener(false)" << endl; // debug 
    } 
} 

int main() 
{ 
    _beginthread(Timer, 0, NULL); 
    KeyListener(true); 

    return 0; 
} 
+0

我链接了代码,因为我不知道如何/没有特权嵌入它。 – Rob 2012-04-26 16:36:21

+1

在运行到线程之前,先了解C++中函数的工作原理。 – Dani 2012-04-26 16:39:05

+1

你正在调用这个函数两次。你不停止第一个你正在创建另一个立即停止。 – twain249 2012-04-26 16:40:04

回答

0

10秒后,单独的线程调用KeyListener(false)。这为设置了Active false,该函数调用。但是,原来的KeyListener(true)函数调用是不受影响。新的调用无法影响旧调用的非静态局部变量。


volatile bool Active; 

void KeyListener() 
{ 
    cout << Active << endl; //debug 
    while (Active==true){ 
     cout << "loop still running." << endl; //debug 
     Sleep(100); 
     for (int i=8;i<=190;i++){ 
      if (GetAsyncKeyState(i) == -32767){ 
       KeyWrite(i); // (turns the numbers into characters) 
      }  
     } 
    } 
} 

void Timer(void* pParams){ 
    while (true){ 
     Sleep(10000); 
     Active = false 
     cout << "Active = false" << endl; // debug 
    } 
} 

int main() 
{ 
    Active = true; 
    _beginthread(Timer, 0, NULL); 
    KeyListener(); 

    return 0; 
} 
+0

谢谢你的帮助山姆。你能告诉我是否可以从另一个线程中断一个循环?再次感谢! – Rob 2012-04-26 16:43:30

+0

Rob,@ZanLynx答案看起来像是指向正确的方向。如果你需要更多的帮助,评论他的答案,将会观看。 – 2012-04-26 16:46:25

+0

嗯,我把主动变成一个易变的布尔值,(它应该使它成为一个全局的布尔?),但仍然没有效果。 – Rob 2012-04-26 16:59:18

0

您有两个不同的线程调用相同的函数。这创造了两个不同的Active值。

再次调用函数不会影响先前调用的参数值。

+0

同样的问题给你,是否有可能中断从另一个线程的循环?谢谢你的帮助! – Rob 2012-04-26 16:44:29

1

每个您的通话以KeyListener都有自己的活动副本,因为它是一个函数参数。

您需要使这个值可用于两个线程。它应该可能是一个全球性的。它需要标记为volatile,否则编译器会将该值存储到寄存器中,并且从不从主存储器读取它,否则它甚至会将其变为无限循环。

一个更好的方法是使用某种事件或条件变量,它将正确线程同步。

+0

非常感谢,我一定会看到 – Rob 2012-04-26 16:45:58

0

你说

它应该测试阉主动每个周期是真实 这可能并非如此。编译器可以优化该比较,因为它没有看到该块中的任何内容正在执行。我建议你使用Active的volatile修饰符来确保代码每次都检查内存中的Active值。

volatile bool Active; 

编辑: 此外,有人指针移出,在你的定时器功能调用的KeyListener(假)的某些原因。您应该将Active设置为false(已将其注释掉)。

0

我很确定你正在调用你的KeyListener函数并不是同一个主函数调用。只在主线程中调用KeyListener,然后在其他线程中,让它访问共享变量并将其设置为false。