0

我无法停止KeyListener函数中的 while 循环。该函数每 10 秒Timer声明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;
}
4

5 回答 5

1

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

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

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

于 2012-04-26T16:42:18.743 回答
0

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

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

于 2012-04-26T16:40:18.430 回答
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;
}
于 2012-04-26T16:40:41.603 回答
0

你说

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

volatile bool Active;

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

于 2012-04-26T16:42:58.493 回答
0

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

于 2012-04-26T16:46:56.257 回答