与文件一起工作。 - 页 3 123456789 新评论 --- 2011.05.29 13:01 #21 Yedelkin:"当你关闭一个文件时,数据会自动重置到磁盘上,所以没有必要在调用FileClose()之前调用FileFlush()" - 是的,是的,我开始明白sergeev 在说什么了。所以,事实证明,你可以调用FileFlush()来代替FileClose(),以保证将最后一条记录保存到文件中?而这将是一个聪明的解决方案?不是代替,而是必然的。冲洗 - 重置剩余数据,但不 关闭文件。这就是你想要的,对吗?关闭--将其余的数据重置到磁盘并关闭。 Yedelkin 2011.05.29 13:19 #22 sergeev: 不是代替,而是必然的。 冲洗 - 重置剩余数据,但不 关闭文件。这就是你想要的,对吗? 关闭 - 将剩余的数据冲到磁盘上并关闭。 是的,这正是我们正在谈论的问题。谢谢你的提示,这是一个聪明的解决方案。 [删除] 2011.05.29 23:03 #23 Yedelkin:关于使用FileFlush()的时间最小化的东西,效果不是很好。 2011.05.29 21:58:20 FlushSave (EURGBP,M1) FileFlush.GetTickCount() = 133766 2011.05.29 22:00:33 FlushSave (EURGBP,M1) FileClose.GetTickCount() = 133734 事实上,这两个功能需要相同的时间来工作。根据我的理解,这一行将位置移动到文件的开头,没有偏移。这允许覆盖现有的信息(即日期被更新,但它不会在文件中累积)。FileSeek(handle_file,0,SEEK_SET); 使用move to end of file而不是SEEK_SET,数据会在文件中堆积。 TheXpert 2011.05.29 23:05 #24 Yedelkin:每次刷新时,你都会打开一个新的文件句柄。为了什么?而且你也没有顺便关闭它。FileFlush函数的 好处是,你不需要重新打开句柄。 Документация по MQL5: Файловые операции / FileFlush www.mql5.com Файловые операции / FileFlush - Документация по MQL5 Yedelkin 2011.05.29 23:07 #25 Interesting: 1.按照我的理解,这一行是在文件中移动位置,没有偏移。这允许现有的信息被覆盖(即日期被更新,但不在文件中累积)。 因此,如果用它代替SEEK_SET 跳到文件的末尾,数据将在文件中累积。 已经有时间删除我的信息了。在这个例子中,在向文件写完后插入了FileFlush()。 Yedelkin 2011.05.29 23:16 #26 TheXpert: 每次刷新时,你都会打开一个新的文件句柄。为了什么?而且你也没有顺便关闭它。 FileFlush函数的 好处是,你不需要重新打开句柄。 我是这样做的。int handle_file; datetime t; uint u; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //---пример с функцией FileFlush() u=GetTickCount(); handle_file=FileOpen("Ye_file.txt",FILE_READ|FILE_WRITE|FILE_TXT); //for(int i=0;i<100000;i++) for(int i=0;i<1000;i++) { if(handle_file!=INVALID_HANDLE) { t=TimeLocal(); FileSeek(handle_file,0,SEEK_SET); FileFlush(handle_file); FileWrite(handle_file,t); } } FileClose(handle_file); Print("FileFlush. GetTickCount() = ",GetTickCount()-u); //---пример без функции FileFlush() u=GetTickCount(); for(int i=0;i<1000;i++) { handle_file=FileOpen("Ye_file.txt",FILE_READ|FILE_WRITE|FILE_TXT); if(handle_file!=INVALID_HANDLE) { t=TimeLocal(); FileSeek(handle_file,0,SEEK_SET); FileWrite(handle_file,t); FileClose(handle_file); } } Print("FileClose. GetTickCount() = ",GetTickCount()-u); } 结果。 2011.05.29 23:14:31 FlushSave (EURGBP,M1) FileFlush.GetTickCount() = 13563 2011.05.29 23:14:32 FlushSave (EURGBP,M1) FileClose.GetTickCount() = 531 根据文件规定,交换了线路。 FileFlush(handle_file); FileWrite(handle_file,t); 但 我不明白 在FileWrite() 之前调用FileFlush() 有什么意义。 [删除] 2011.05.29 23:53 #27 Yedelkin:我是这样做的。结果。2011.05.29 23:14:31 FlushSave (EURGBP,M1) FileFlush.GetTickCount() = 13563 2011.05.29 23:14:32 FlushSave (EURGBP,M1) FileClose.GetTickCount() = 531我根据文件规定,调换了线路。 但在FileWrite() 之前调用FileFlush() 的意义还未 被理解。这里有一个变体。int handle_file; datetime t; uint u; void OnStart() { //---пример с функцией FileFlush() u=GetTickCount(); handle_file=FileOpen("Ye_file.txt",FILE_READ|FILE_WRITE|FILE_TXT); for(int i=0;i<1000;i++) { if(handle_file!=INVALID_HANDLE) { t=TimeLocal(); FileSeek(handle_file,0,SEEK_END); FileFlush(handle_file); FileWrite(handle_file,t); } } FileClose(handle_file); Print("FileFlush. GetTickCount() = ",GetTickCount()-u); }其结果是FileFlush。GetTickCount() = 26125这里有一个变体。int handle_file; datetime t; uint u; void OnStart() { //---пример без функции FileFlush() u=GetTickCount(); for(int i=0;i<1000;i++) { handle_file=FileOpen("Ye_file2.txt",FILE_READ|FILE_WRITE|FILE_TXT); if(handle_file!=INVALID_HANDLE) { t=TimeLocal(); FileSeek(handle_file,0,SEEK_END); FileWrite(handle_file,t); FileClose(handle_file); } } Print("FileClose. GetTickCount() = ",GetTickCount()-u); } 其结果是FileClose。GetTickCount() = 3969 [删除] 2011.05.30 00:12 #28 这个选项给出的结果在47和110之间int handle_file; datetime t; uint u; void OnStart() { u=GetTickCount(); handle_file=FileOpen("Ye_file.txt",FILE_READ|FILE_WRITE|FILE_TXT); for(int i=0;i<1000;i++) { if(handle_file!=INVALID_HANDLE) { t=TimeLocal(); FileSeek(handle_file,0,SEEK_END); FileWrite(handle_file,t); } } FileClose(handle_file); Print("FileFlush. GetTickCount() = ",GetTickCount()-u); }1.结论 - 在一个循环中使用FileFlush 会使执行速度减慢260倍左右。2.在这个变体中,对50,000条记录进行循环,结果如下 - FileFlush。GetTickCount() = 1891.3.我在执行50000次写入循环而不退出文件时,未能杀死终端(我关闭了终端并 "杀死 "了进程)。4.我能够用100000个循环杀死终端,而文件中包含了超过65536条记录(Excel 2003中的空间这么大)。 TheXpert 2011.05.30 01:24 #29 Yedelkin:我按照文件规定调换了线路。文件中哪里有这样的规定? 但 我还是不明白 在FileWrite() 之前调用FileFlush() 的意义 。 你怎么能让没有的东西有意义呢?返回字符串的顺序并仔细检查。显然,文件没有正确表达。 但是...感谢你的测试,这个错误似乎已经被发现了--当不做任何改变时,FileFlush 似乎占用了过多的时间。有趣的 是。OMG!这是推论的地方,它是一个泥潭。这就是 "OOP更快 "或 "指标很慢,我们应该把整个代码移到专家顾问上 "等说法出现的原因。 TheXpert 2011.05.30 01:38 #30 papaklass:专家,写下如何正确使用这个功能。假设如此。// open handle for(int i=0;i<1000;i++) { if(handle_file!=INVALID_HANDLE) { t=TimeLocal(); FileSeek(handle_file,0,SEEK_END); FileWrite(handle_file,t); FileFlush(handle_file); } } // close handle也就是说,将FileClose -- FileOpen捆绑与FileFlush 进行比较是正确的。理论上,FileFlush应该是FileClose的一部分,不可能比捆绑的速度慢。在变化出现之前,冲洗变化是没有意义的,因为它们还没有出现 :)但是,尽管结论很疯狂,但测试是有参考价值的,所以我们等待开发者对没有变化时功能如何工作的评论。 123456789 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
"当你关闭一个文件时,数据会自动重置到磁盘上,所以没有必要在调用FileClose()之前调用FileFlush()" - 是的,是的,我开始明白sergeev 在说什么了。所以,事实证明,你可以调用FileFlush()来代替FileClose(),以保证将最后一条记录保存到文件中?而这将是一个聪明的解决方案?
不是代替,而是必然的。
冲洗 - 重置剩余数据,但不 关闭文件。这就是你想要的,对吗?
关闭--将其余的数据重置到磁盘并关闭。
不是代替,而是必然的。
冲洗 - 重置剩余数据,但不 关闭文件。这就是你想要的,对吗?
关闭 - 将剩余的数据冲到磁盘上并关闭。
关于使用FileFlush()的时间最小化的东西,效果不是很好。
2011.05.29 21:58:20 FlushSave (EURGBP,M1) FileFlush.GetTickCount() = 133766
2011.05.29 22:00:33 FlushSave (EURGBP,M1) FileClose.GetTickCount() = 133734
事实上,这两个功能需要相同的时间来工作。
根据我的理解,这一行将位置移动到文件的开头,没有偏移。这允许覆盖现有的信息(即日期被更新,但它不会在文件中累积)。
使用move to end of file而不是SEEK_SET,数据会在文件中堆积。
每次刷新时,你都会打开一个新的文件句柄。为了什么?而且你也没有顺便关闭它。
FileFlush函数的 好处是,你不需要重新打开句柄。
1.按照我的理解,这一行是在文件中移动位置,没有偏移。这允许现有的信息被覆盖(即日期被更新,但不在文件中累积)。
因此,如果用它代替SEEK_SET 跳到文件的末尾,数据将在文件中累积。每次刷新时,你都会打开一个新的文件句柄。为了什么?而且你也没有顺便关闭它。
FileFlush函数的 好处是,你不需要重新打开句柄。
我是这样做的。
结果。
2011.05.29 23:14:31 FlushSave (EURGBP,M1) FileFlush.GetTickCount() = 13563
2011.05.29 23:14:32 FlushSave (EURGBP,M1) FileClose.GetTickCount() = 531
根据文件规定,交换了线路。
但 我不明白 在FileWrite() 之前调用FileFlush() 有什么意义。我是这样做的。
结果。
2011.05.29 23:14:31 FlushSave (EURGBP,M1) FileFlush.GetTickCount() = 13563
2011.05.29 23:14:32 FlushSave (EURGBP,M1) FileClose.GetTickCount() = 531
我根据文件规定,调换了线路。
但在FileWrite() 之前调用FileFlush() 的意义还未 被理解。这里有一个变体。
其结果是FileFlush。GetTickCount() = 26125
这里有一个变体。
其结果是FileClose。GetTickCount() = 3969这个选项给出的结果在47和110之间
1.结论 - 在一个循环中使用FileFlush 会使执行速度减慢260倍左右。
2.在这个变体中,对50,000条记录进行循环,结果如下 - FileFlush。GetTickCount() = 1891.
3.我在执行50000次写入循环而不退出文件时,未能杀死终端(我关闭了终端并 "杀死 "了进程)。
4.我能够用100000个循环杀死终端,而文件中包含了超过65536条记录(Excel 2003中的空间这么大)。
我按照文件规定调换了线路。
文件中哪里有这样的规定?
你怎么能让没有的东西有意义呢?返回字符串的顺序并仔细检查。显然,文件没有正确表达。
但是...感谢你的测试,这个错误似乎已经被发现了--当不做任何改变时,FileFlush 似乎占用了过多的时间。有趣的 是。
OMG!这是推论的地方,它是一个泥潭。这就是 "OOP更快 "或 "指标很慢,我们应该把整个代码移到专家顾问上 "等说法出现的原因。
专家,写下如何正确使用这个功能。
假设如此。
也就是说,将FileClose -- FileOpen捆绑与FileFlush 进行比较是正确的。
理论上,FileFlush应该是FileClose的一部分,不可能比捆绑的速度慢。
在变化出现之前,冲洗变化是没有意义的,因为它们还没有出现 :)
但是,尽管结论很疯狂,但测试是有参考价值的,所以我们等待开发者对没有变化时功能如何工作的评论。