全局变量
问题描述:
我与具有定时器,定时器一些C++代码工作运行此:全局变量
char buf[1024];
ZeroMemory(&buf, sizeof(buf));
somefunction(buf); // this put stuff into buf
otherfunction(buf); // this do stuff with buf
somefunction()做一个网络请求和的InternetReadFile()把数据在“BUF”
但是我需要能够在下次执行定时器时读取先前的buf。如何将buf存储在全局变量中并重新分配它,或者在必要时使“buf”等于先前存储的值?
答
如果不需要同时处理访问定时器动作函数的多个线程,可以将buf
设置为函数范围内的静态变量或匿名名称空间中的文件变量(或if你是一个像我这样的未改编的C程序员,进入一个文件静态变量)。然后确保代码不会将内存调零,直到您知道不想再次查看旧数据为止。
或者:
void timer_action(void)
{
static char buf[1024];
...use buf carefully...
}
或者:
namespace {
char buf[1024];
}
void timer_action(void)
{
...use buf carefully...
}
如果没有其他需要缓冲,它隐藏在函数内部的范围最小化,并是首选解决方案。
如果确实有多个线程参与,则必须非常小心,使用适当的线程同步原语来确保对变量的顺序访问,或者必须在线程本地存储器中创建每个线程副本的变量。
答
如果您需要旧的RAW数据,没有问题吗?而是从当前RAW缓冲区中提取感兴趣的片段,并将其作为成员变量存储在您的类中。对于下一次阅读,相关状态可用。如果你的代码是关于状态转换的话,状态设计模式在这里也可能有用。
这将帮助你避免与静态变量的问题作为@Jonathan指出
你的问题中提到“的InternetReadFile()”,但你的代码只提到“otherfunction()” - 这你是什么意思? 'cpp'是指C++而不是C预处理器? – 2010-09-30 02:54:04
你在处理需要使用变量的多个线程吗? – 2010-09-30 02:55:20
远远少于上下文。 – 2010-09-30 02:58:56