2010-09-30 207 views
0

我与具有定时器,定时器一些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”等于先前存储的值?

+1

你的问题中提到“的InternetReadFile()”,但你的代码只提到“otherfunction()” - 这你是什么意思? 'cpp'是指C++而不是C预处理器? – 2010-09-30 02:54:04

+0

你在处理需要使用变量的多个线程吗? – 2010-09-30 02:55:20

+0

远远少于上下文。 – 2010-09-30 02:58:56

回答

1

如果不需要同时处理访问定时器动作函数的多个线程,可以将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... 
} 

如果没有其他需要缓冲,它隐藏在函数内部的范围最小化,并是首选解决方案。

如果确实有多个线程参与,则必须非常小心,使用适当的线程同步原语来确保对变量的顺序访问,或者必须在线程本地存储器中创建每个线程副本的变量。

0

如果您需要旧的RAW数据,没有问题吗?而是从当前RAW缓冲区中提取感兴趣的片段,并将其作为成员变量存储在您的类中。对于下一次阅读,相关状态可用。如果你的代码是关于状态转换的话,状态设计模式在这里也可能有用。

这将帮助你避免与静态变量的问题作为@Jonathan指出