首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不使用全局变量的情况下通知外部线程主线程状态?

如何在不使用全局变量的情况下通知外部线程主线程状态?
EN

Stack Overflow用户
提问于 2013-06-09 09:52:57
回答 1查看 545关注 0票数 0

假设我有一个主线程,它正在运行我的win32过程,还有一些辅助线程来执行用户点击的功能。

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

向线程传递参数仅捕获主线程在特定时间点的状态。如果我想要跨不同的时间范围或事件监视主线程的状态,该怎么办?

我目前有几个全局布尔值来标记/通知程序的当前模式或状态,这就是我通知工作线程如何改变其行为的方式。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-09 10:23:11

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

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

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

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

代码语言:javascript
复制
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
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17005666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档