我正在重新编程C#中的应用程序以在Windows CE上运行,但是,我的机器内存不足 所以我需要分配适当数量的程序存储器和存储器。但我无法在每次重启时手动分配它,然后我找到了SetSystemMemoryDivision()函数 我所做的分配代码基本上如下:
public void setmemory()
{
//Checks if the memory is correctly allocated
while (storage_page != 800)
{
//Set the memory to 800 pages of 4096 bytes each ( = 800 * 4kB 3.200Kb )
storage_page = 800;
//Writes the seted memory
SetSystemMemoryDivision(storage_page);
Thread.Sleep(200);
//Read system memory
GetSystemMemoryDivision(ref storage_page, ref ram_page, ref page_size);
}
}
callmenu();
(该功能正常,但如果我之前没有手动分配可接受的内存值,我的应用程序仍会冻结机器。
如何在运行任何可以暂停机器的进程之前确保已分配内存?)以下更正:
我对这个问题错了。真正的应用程序只有在我的设备与计算机连接并通过Visual Studio运行Debug之后才能运行。每次我重新启动设备并尝试运行我的应用程序而不在PC上调试它,系统停止。即使我手动分配内存。所以,似乎系统正在冻结,因为程序试图分配超过可用的32MB。
答案 0 :(得分:3)
这是一项艰巨的挑战。首先,您需要知道应用程序需要运行多少内存。知道这一点的唯一方法是测试,测试和测试。然后添加应急金额。
一旦你有了这个号码,你可以在应用启动的早期调用SetSystemMemoryDivision
,然后开始在堆上分配大量内容并耗尽内存。在static void Main()
的早期,在您致电Application.Run()
之前,这将是典型的候选位置。
如果“需要的数量”未知,您始终可以创建后台服务线程,该线程定期检查可用内存并重新调整内存分区以尝试始终为GC堆增长空间。这更难实现,但并非不可能。
这是一个示例计时器proc,用于将内存保持在可用的95%(它将作为整数存储在HoldProgramMemoryPercent
中,如95):
private void TimerProc(object state)
{
// check and adjust memory
var total = MemoryManagement.SystemProgramMemory + MemoryManagement.SystemStorageMemory;
var before = (MemoryManagement.SystemProgramMemory / (float)total) * 100;
var requiredStorage = (int)(((100 - HoldProgramMemoryPercent) / 100f) * total);
if ((requiredStorage != m_lastLevel) && (requiredStorage != MemoryManagement.SystemStorageMemory))
{
MemoryManagement.SystemStorageMemory = requiredStorage;
var after = (MemoryManagement.SystemProgramMemory / (float)total) * 100;
Debug.WriteLine(string.Format("Program memory changed from {0}% to {1}%", before, after));
m_lastLevel = requiredStorage;
}
Debug.WriteLine(string.Format("Memory load is at {0}%", MemoryManagement.MemoryLoad));
}
答案 1 :(得分:1)
问题解决了。
主要问题在于CF 2.0的GC,它无法正确管理收集。 通过在机器和项目中将NET CF v2.0升级到v3.5,GC开始正确管理收集并且应用程序运行良好。
感谢所有试图提供帮助的人,我希望我可以帮助有类似问题的人。
答案 2 :(得分:0)
使用此代码。 int value ratio作为参数存储器
[DllImport("coredll.dll")]
private static extern int GetSystemMemoryDivision(ref int lpdwStorePages, ref int ldpwRamPages, ref int ldpwPageSize);
[DllImport("coredll.dll")]
private static extern int SetSystemMemoryDivision(int dwStorePages);
public static void SetMemory(int division)
{
int storePages = 0;
int ramPages = 0;
int pageSize = 0;
int totalPages = 0;
if (GetSystemMemoryDivision(ref storePages, ref ramPages, ref pageSize) == 1)
{
totalPages = storePages + ramPages;
storePages = Convert.ToInt32(totalPages * (100 - division) / 100);
SetSystemMemoryDivision(storePages);
}
}