2010-09-30 9 views
0

Я работаю с некоторым кодом C++, который имеет таймер и таймер работает следующим образом:Глобальные переменные в 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 в глобальном var и переназначить его или сделать «buf» равным ранее сохраненному значению, если это необходимо?

+1

Ваш вопрос упоминает «InternetReadFile()», но ваш код только упоминает «otherfunction()» - что вы имели в виду? И 'cpp' означает C++, а не C Pre-Processor? –

+0

Вы имеете дело с несколькими потоками, которые должны использовать переменные? –

+0

Слишком мало контекста. –

ответ

1

Если вам не нужно иметь дело с несколькими потоками, обращающимися к функции действия таймера одновременно, вы можете сделать buf либо статической переменной в рамках функции, либо файловой переменной в анонимном пространстве имен (или, если вы нереформированный программист на 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-буфера и сохраните их как переменные-члены в своем классе. Для следующего чтения доступно соответствующее состояние. State Design Pattern также может быть полезен здесь, если ваш код относится к переходам состояний.

Это поможет избежать проблем, связанных со статическими переменными, как @ Джонатан указал

Смежные вопросы