的自己的副本多個實例我有兩個項目:如何創建帶有全局變量
- 嵌入式一個,用C++編寫,其中大量採用了靜態/全局變量。
- 第二個,在PC上運行並使用與嵌入式相同的源代碼。
它非常好。
但現在第二個項目應該運行嵌入式項目的多個實例。此外,每個實例都應該有自己的靜態/全局變量副本,我應該能夠在一個程序範圍內與每個實例進行交互。我不知道如何處理所有靜態/全局變量。
有沒有簡單的方法可以解決我的問題?
的自己的副本多個實例我有兩個項目:如何創建帶有全局變量
它非常好。
但現在第二個項目應該運行嵌入式項目的多個實例。此外,每個實例都應該有自己的靜態/全局變量副本,我應該能夠在一個程序範圍內與每個實例進行交互。我不知道如何處理所有靜態/全局變量。
有沒有簡單的方法可以解決我的問題?
有幾種方法可以解決這個問題:
產生多個進程(每個都有自己的一套全局的),並將它們與主程序之間的溝通渠道建立。
擺脫全局變量。最簡單的方法是將它們全部轉儲到類中(作爲非靜態成員),並使用該類的實例訪問每組變量。
無論哪種方式,如果您有大量的全局變量,解決這個問題不是一個小問題。
我會和(2)一起去。在嵌入式代碼中,只需在main()中創建一個靜態的'Global'類實例。在PC上,儘可能多地製作。 –
運行兩個獨立的過程,並使用某種形式的IPC的進程之間進行通信。在Windows上使用IPC機制包括:
對於這些細節見here。其他操作系統中也有類似的機制。
一個也許更簡單的替代方法是在一個單獨的線程中運行每個實例並將全局置於thread local storage中。
在所有情況下,然而,你應該避免尼特只是「很多」,但任何全局變量。這通常表明設計不佳。有關全局變差的原因,請參見this article,以及避免它們的方法。
正如其他人回答說最好的解決辦法是擺脫全局,但我明白,這並不總是可行的。 我遇到了與我們的代碼庫完全相同的問題。
我使用的解決方案是將每個實例構建爲單獨的DLL。 然後加載我在運行時加載每個DLL與LoadLibrary()
。 通過這種方式,您可以將所有內容都運行在單個進程中,並擁有相同全局和單例的多個版本。 然後您不需要使用任何IPC,但可以通過簡單的函數調用在實例之間傳遞數據。它也使調試更容易,因爲您可以在一個調試器中看到所有內容。
注:我在Windows上創建它,但我認爲在Unix上可能有類似的東西。
這是一個很好的解決我的問題 –
擺脫全局變量。 – Jocke
我同意Jocke--在這種情況下,您需要以某種方式清除全局變量的代碼。 –
這是一個非常大的項目,有很多靜態方法和靜態字段。它有意地簡化了程序對象之間的交互。 –