0

假设我有主线程,它正在运行我的 win32 程序和一些工作线程来执行用户单击的功能。

假设主要功能发生了变化(我希望 1 个按钮可用,而另一个按钮不可用,但仅当程序进入某种状态时(即通过布尔触发器或类似性质的东西),并通知所有正在运行我想禁用终止的线程?)?

将参数传递给线程仅捕获主线程在某个时间点的状态。如果我想在不同的时间范围或事件中监控我的主线程的状态怎么办?

我目前有一些全局布尔值来标记/指示程序的当前模式或状态,这就是我如何通知工作线程他们应该如何改变他们的行为。

我应该消除对全局变量的使用还是保留它们?或者如果我应该消除全局变量,我将如何重新实现我的程序?

4

1 回答 1

3

您仍然可以在构建时将参数传递给您的工作线程。但是不要将您的状态变量的副本传递给它(因为正如您所说,它们“仅在某个时间点捕获主线程的状态”,即工作线程创建时间)。

相反,将它的指针(或引用)传递给您的状态变量。

因为它们是指针,所以您的工作线程将可以访问来自主线程的最新数据,而无需使用全局变量。

下面是一个伪代码示例(没有任何同步机制,如互斥锁):

DWORD MyThreadFunction( LPVOID argument );

int main()
{
    bool mySyncVar = false;
    bool* mySyncVarPtr = &mySyncVar;

    CreateThread( 
        NULL,               // default security attributes
        0,                  // use default stack size  
        MyThreadFunction,   // thread function name
        mySyncVarPtr,       // argument to thread function--NOTE THAT THIS IS
                            // A POINTER TO THE SYNC VARIABLE 
        0,                  // use default creation flags 
        NULL);              // returns the thread identifier 

    for (...)
    {
        // Do stuffs
        mySyncVar = true; // Will trigger worker thread
        // ...
    }

    return 0;
}

DWORD MyThreadFunction( LPVOID argument )
{
    bool* syncPtr = reinterpret_cast<bool*>(argument); // Remember this
                                                       // is a pointer
    for (...)
    {
        while (false == *syncPtr)
        {
            // Wait...
        }
        // Trigger
        // Update your buttons now
    }
}
于 2013-06-09T02:23:11.347 回答