错误、漏洞、问题 - 页 1593

 
产品召回信息出现在智能手机上,而在LC和μl网站上面则没有。
 


神奇的脚本扭转了时间;-)

神奇的脚本扭转了时间;-)

 
Vladimir Pastushak:
智能手机收到一条关于产品评论的信息,但不是在LC或mcl网站的顶部。
一直以来都是这样,我记得他们甚至要求把它放在网站上,因为当他们留下反馈时,很奇怪,甚至他们马上问你问题,你在2个月后才发现。:-)
 

不是一个错误,但忍不住要分享一下

写作

if((!IsRunOnTester() && TimeCurrent() >= D'2016.06.31 23:59'))// для тестировщиков, ограничение работы по времени

编译器发出了一个警告

无效日期 *****.mq4 115 46

它还检查有效的字符串日期,我很震惊 )(6月的30天)

 

显然,没有人关心这个,但我还是要写。

真正的任务是创建总大小约为100%空闲内存的数组,迅速用数字填满它们,进行计算并释放它们。

我尝试用以下方法来获得自由内存的大小

int mem_free_mb=(int)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE);

结果:23987 MB,我的物理内存是12141 MB,即一半的容量。

我明白这个数字是针对火星人的,但我仍然相信它,并写了一个脚本来测试它。

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
#define  PARTS 5

   srand(GetTickCount());
//---
   int mem_free_mb=(int)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE);
   //mem_free_mb=5300;//<--- Столько показывает 'Доступной' в диспетчере задач.
   long mem_for_calc=(long)((double)mem_free_mb*1024*1024);
   long mem_one_part=(long)floor((double)mem_for_calc/PARTS);
   if(mem_one_part>=INT_MAX-1)
      mem_one_part=INT_MAX-1;
//---
   printf("Memory for calc: %0.f MB, parts: %d, part: %0.f MB",mem_for_calc/1024/1024,PARTS,mem_one_part/1024/1024);
   char array1[];
   char array2[];
   char array3[];
   char array4[];
   char array5[];

   int res=ArrayResize(array1,(int)mem_one_part);
   Print("Array1 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",1.0*mem_one_part/1024/1024);

   res=ArrayResize(array2,(int)mem_one_part);
   Print("Array2 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",2.0*mem_one_part/1024/1024);

   res=ArrayResize(array3,(int)mem_one_part);
   Print("Array3 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",3.0*mem_one_part/1024/1024);

   res=ArrayResize(array4,(int)mem_one_part);
   Print("Array4 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",4.0*mem_one_part/1024/1024);

   res=ArrayResize(array5,(int)mem_one_part);
   Print("Array5 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",5.0*mem_one_part/1024/1024);

   uint gtc=GetTickCount();
   for(int i=0;i<mem_one_part;i++)
     {
      char ch=(char)rand();
      array1[i]=ch;
      array2[i]=ch;
      array3[i]=ch;
      array4[i]=ch;
      array5[i]=ch;
     }
//---
   printf("Spent time: %d ms",GetTickCount()-gtc);
  }

我得到一个逻辑结果--不可能分配Array3,因为内存已经用完。

然后我取消注释行,在那里我指定现在有多少内存可用。

mem_free_mb=5300;//<--- Столько показывает 'Доступной' в диспетчере задач.

之后,脚本成功运行。

我不想成为开发人员的麻烦,但知道有多少内存可用是很重要的。

请让我们通过TerminalInfoInteger 来了解它。

 

你是否意识到,在大多数情况下,你将无法检索到所有可用的内存?

有这样一种东西,即内存碎片。你决定将所有的内存分成5个片段--而系统没有一个不间断的内存片段的大小是你需要的。

 
Slawa:

你是否意识到,在大多数情况下,你将无法检索到所有可用的内存?

有这样一个概念--内存碎片化。你决定将所有的内存分成5个片段--但是系统没有一个你需要的连续内存片段。

1.你能不能先弄清楚TERMINAL_MEMORY_AVAILABLE 这个参数的物理含义?

2.关于片段,我认为这应该由Windows内存管理器处理,而不是由程序员处理。

我需要知道在某一时刻我可以使用多少,例如,我想使用50%的可用内存。

另一个真正的任务是CopyTicks请求。如果你请求的点数超过可用的内存,你就会得到 "内存不足"。

 
Andrey Voytenko:

另一个真正的挑战是CopyTicks请求。如果你请求的点数超过可用的内存,你就会得到 "内存不足"。

或者,将数据卸载到一个文件中,然后从那里提取所需的片段
 
coderex:
或者,将数据上传到一个文件中,然后从那里提取所需的片段。

这对我来说很慢。我想通过记忆做一切事情。实际上现在已经在做了,但我必须调用GlobalMemoryStatusEx来找出可用内存的大小。


	          
 
Andrey Voytenko:

在云代理上进行优化时,这个问题尤其严重,因为你从一开始就对其能力一无所知。 无论是通过MQL,还是通过WinApi(因为禁止调用dll),都不可能确定那里的真实可用内存量。

那就真的不清楚TERMINAL_MEMORY_AVAILABLE有什么实际意义了? 如果它既不会让我们高兴也不会让我们不高兴,我们为什么要引入它?