2010-09-30 333 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指出