Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在不使用全局变量的情况下通知外部线程主线程状态?_C++_Multithreading_Winapi_State_Main - Fatal编程技术网

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

C++ 如何在不使用全局变量的情况下通知外部线程主线程状态?,c++,multithreading,winapi,state,main,C++,Multithreading,Winapi,State,Main,假设我有一个主线程,它正在运行我的win32过程和几个工作线程来执行用户单击的功能 假设主函数发生了变化(我希望1个按钮可用,而另一个按钮不可用,但仅当程序进入某个状态时(即通过布尔触发器或类似性质的东西),并通知我要禁用的所有正在运行的线程终止?) 向线程传递参数仅捕获主线程在某个时间点的状态。如果我想跨不同的时间框架或事件监视主线程的状态,该怎么办 我目前有一些全局布尔值来标记/通知程序的当前模式或状态,这就是我通知工作线程应该如何更改其行为的方式 我应该取消使用全局变量还是保留它们?或者,

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

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

向线程传递参数仅捕获主线程在某个时间点的状态。如果我想跨不同的时间框架或事件监视主线程的状态,该怎么办

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


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

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

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

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

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

DWORD MyThreadFunction(LPVOID参数);
int main()
{
bool mySyncVar=false;
bool*mySyncVarPtr=&mySyncVar;
创建线程(
NULL,//默认安全属性
0,//使用默认堆栈大小
MyThreadFunction,//线程函数名
mySyncVarPtr,//线程函数的参数——注意这是
//指向SYNC变量的指针
0,//使用默认创建标志
NULL);//返回线程标识符
对于(…)
{
//做事
mySyncVar=true;//将触发工作线程
// ...
}
返回0;
}
DWORD MyThreadFunction(LPVOID参数)
{
bool*syncPtr=reinterpret_cast(参数);//记住这一点
//这是一个指针
对于(…)
{
while(false==*syncPtr)
{
//等等。。。
}
//触发
//现在更新你的按钮
}
}

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

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

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

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

DWORD MyThreadFunction(LPVOID参数);
int main()
{
bool mySyncVar=false;
bool*mySyncVarPtr=&mySyncVar;
创建线程(
NULL,//默认安全属性
0,//使用默认堆栈大小
MyThreadFunction,//线程函数名
mySyncVarPtr,//线程函数的参数——注意这是
//指向SYNC变量的指针
0,//使用默认创建标志
NULL);//返回线程标识符
对于(…)
{
//做事
mySyncVar=true;//将触发工作线程
// ...
}
返回0;
}
DWORD MyThreadFunction(LPVOID参数)
{
bool*syncPtr=reinterpret_cast(参数);//记住这一点
//这是一个指针
对于(…)
{
while(false==*syncPtr)
{
//等等。。。
}
//触发
//现在更新你的按钮
}
}

您始终可以设置消息循环并使用
PostThreadMessage
。全局变量有时是最不麻烦的选项。确实,我始终可以设置自己的自定义消息并使用PostThreadMessage。这是一个非常好的主意,因为我的线程无论如何都会在无限循环中运行。您可以始终设置消息循环并使用
PostThreadMessage
。全局变量有时是最不麻烦的选项。确实,我可以始终设置自己的自定义消息并使用PostThreadMessage。这是一个很好的主意,因为我的线程无论如何都会在无限循环中运行。
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
    }
}