使用线程C ++停止while循环

时间:2012-04-26 16:34:26

标签: c++ loops while-loop interrupt

我无法在KeyListener函数中停止while循环。 {10} Timer函数每隔10秒将Active声明为false。但是while函数中的KeyListener循环仍然在运行。

我无法弄清楚为什么循环继续运行;每个周期都应该测试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;
}

5 个答案:

答案 0 :(得分:1)

您对KeyListener的每次调用都有自己的Active副本,因为它是一个函数参数。

您需要为两个线程提供此值。它可能应该是一个全球性的。它需要标记为volatile,否则编译器会将值存储到寄存器中,而不会从主存中读取它,或者甚至可能将其转换为无限循环。

更好的方法是使用某种类型的事件或条件变量,这些变量将被正确地进行线程同步。

答案 1 :(得分:0)

你有两个不同的线程调用相同的函数。这会创建两个不同的 Active值。

再次调用函数不会影响上一次调用的参数值。

答案 2 :(得分: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;
}

答案 3 :(得分:0)

你说

  

它应该测试的每个周期都是活动的   情况可能并非如此。编译器可能正在优化该比较,因为它没有看到在该块中对Active执行任何操作。我建议您使用Active的volatile说明符来确保代码每次都检查Active的内存值。

volatile bool Active;

编辑: 另外,当有人指针输出时,在你的Timer函数中你出于某种原因调用KeyListener(false)。您应该将Active设置为false(已注释掉)。

答案 4 :(得分:0)

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