在C++开发WIN32窗口程序时,很多时候需要用到全局变量和多线程互相调用全局变量等,比如,一个线程用来利用websocket获取服务器的数据并放到一个缓存池中(尽量减少等待),一个线程用来获取缓存池中的变量值以刷新窗口界面显示,一个线程将缓存池中需要更新的数据,拉取更新到数据库,这样可以保证,互不影响。
实现全局变量其实很简单,就是创建一个被所有页面调用的类(含:头文件.h和类文件.cpp),在此文件中先用extern声明一个变量(但千万不要赋值),然后在类文件.cpp中进行相关赋值初始化等。这样就可以在其他文件中调用了(当然,其他文件中要引用此头文件#include “global.h”)
global.h
extern int test;
global.cpp
#include "global.h" int test = 0;
说了原理,我们做个实际例子展示下:
1、创建新项目 - Windows桌面向导
2、选择桌面应用程序
3、创建global.h 和 global.cpp
global.h
#pragma once extern int test; class global { };
global.cpp
#include "global.h" int test = 0;
4、在头文件的资源文件Resource.h中,增加按钮消息变量
#define IDB_BUTTON_TEST 300
5、在项目主文件Project3.cpp中分别增加以下代码
引入全局变量文件和事先声明一个按钮变量名,并且申明一个线程threadA和A的执行方法,以及在WinMain方法中,激活线程threadA
修改窗口大小
增加按钮点击事件
分别在WndProc方法中,增加按钮点击事件和按钮加载语句
做了以上动作后,我们就简单做了:
1、一个C++ WIN32程序窗口
2、窗口有一个按钮pButtonTest,点击按钮后,d出传递过来的字符串:123456
3、一个独立与窗口的线程threadA,此线程每5秒报下自己的名字:线程A
准备工作就做好了,接下来,我们要实现:线程A每1秒将全局变量+1,我们点击窗口线程中的按钮,可以看到当前全局变量的值的变化。
首先,将线程A的执行方法的d窗改成:test++
然后,将点击按钮执行的事件换成
PS:由于我们使用的是“使用 Unicode 字符集”,所以默认d窗提醒MessageBox里的文字要使用多字节字符串,便于展示我先使用窄字符d窗方法:MessageBoxA。
另外,因为使用了sprintf函数,所以,需要增加头文件
#include
最终效果如下
源码下载:https://gitee.com/kefong/project-global.git
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)