程序长时间运行,报“out of system resources”和“重叠I/O操作在进行中”

时间:2021-07-11 14:42:59
用delphi做的一个自动生产控制程序,长时间运行,报“out of system resources”和“重叠I/O操作在进行中”,问题困扰了很长时间,现在对这个问题还是完全没有头绪,请教有哪些可能呢,有什么检查方法或者工具。下面的实际报错图片 程序长时间运行,报“out of system resources”和“重叠I/O操作在进行中”程序长时间运行,报“out of system resources”和“重叠I/O操作在进行中”

10 个解决方案

#1


就是系统资源不足,也就是内存不够用了。你要检查程序代码占内存,未释放,从而占用内存,持续增长,造成系统资源不足。

#2


程序加上 内存泄漏报告
delphi2010以后加上
 ReportMemoryLeaksOnShutdown:=boolean(DebugHook);


delphi 7 使用fastmm4 去检测

如果有多线程操作同一io,加线程锁

#3


找到原因吗? 认真查找会有结果。

#4


检查程序写磁盘文件时,是否出现重复写一个文件,造成I/O错误。写磁盘文件要排它性,即唯一性。

#5


这个键盘绝了...

#6


大概判断:相关的工作没做互斥吧?就是来了事件就响应了,结果可能两个或多个相同的消息来了,一个操作未完成,另一个操作又进入了。
用生产者-消费者模式,建立任务队列(动态或静态,由于相关操作很频繁,我做类似的操作常使用静态数组——前提是我判断在有序的调度中,这些操作可以不费多少时间完成)
1、加入任务:有任务则加入队列;
2、处理任务(一般用线程):处理当前的任务,完成则删除(动态)或作标记(静态)。

#7


引用 6 楼 leeky 的回复:
大概判断:相关的工作没做互斥吧?就是来了事件就响应了,结果可能两个或多个相同的消息来了,一个操作未完成,另一个操作又进入了。
用生产者-消费者模式,建立任务队列(动态或静态,由于相关操作很频繁,我做类似的操作常使用静态数组——前提是我判断在有序的调度中,这些操作可以不费多少时间完成)
1、加入任务:有任务则加入队列;
2、处理任务(一般用线程):处理当前的任务,完成则删除(动态)或作标记(静态)。


应该是这样的,我前面也是在写一个生产者-消费者模型的程序,没有互斥引起的。

#8


哎,代码太多,唯一跟文本io有关的

#9


哎,代码太多,唯一跟文本io有关的,就是这个函数,也是用的最多最频繁的,是不是跟这个有关?
procedure writelnlogfile(str : string);
begin
    try
      writeln(Logfile,Formatdatetime('yyyy-mm-dd hh:mm:ss',now())+' '+str);
      Flush(Logfile);
    except
    end;
end;

#10


1.程序没有释放内存机制,导致程序占用系统越来越多的内存,最后导致崩溃。

2.程序对I/O设备使用后,没有释放使用权,而导致下一周期调用I/O设备的时候出错。——这个 也有可能是设备端口本身的稳定性导致的。

根据提供的图片,推测极有可能是由于原因2引起的。调用端口之前一定要加入检测端口是否空闲的代码

#1


就是系统资源不足,也就是内存不够用了。你要检查程序代码占内存,未释放,从而占用内存,持续增长,造成系统资源不足。

#2


程序加上 内存泄漏报告
delphi2010以后加上
 ReportMemoryLeaksOnShutdown:=boolean(DebugHook);


delphi 7 使用fastmm4 去检测

如果有多线程操作同一io,加线程锁

#3


找到原因吗? 认真查找会有结果。

#4


检查程序写磁盘文件时,是否出现重复写一个文件,造成I/O错误。写磁盘文件要排它性,即唯一性。

#5


这个键盘绝了...

#6


大概判断:相关的工作没做互斥吧?就是来了事件就响应了,结果可能两个或多个相同的消息来了,一个操作未完成,另一个操作又进入了。
用生产者-消费者模式,建立任务队列(动态或静态,由于相关操作很频繁,我做类似的操作常使用静态数组——前提是我判断在有序的调度中,这些操作可以不费多少时间完成)
1、加入任务:有任务则加入队列;
2、处理任务(一般用线程):处理当前的任务,完成则删除(动态)或作标记(静态)。

#7


引用 6 楼 leeky 的回复:
大概判断:相关的工作没做互斥吧?就是来了事件就响应了,结果可能两个或多个相同的消息来了,一个操作未完成,另一个操作又进入了。
用生产者-消费者模式,建立任务队列(动态或静态,由于相关操作很频繁,我做类似的操作常使用静态数组——前提是我判断在有序的调度中,这些操作可以不费多少时间完成)
1、加入任务:有任务则加入队列;
2、处理任务(一般用线程):处理当前的任务,完成则删除(动态)或作标记(静态)。


应该是这样的,我前面也是在写一个生产者-消费者模型的程序,没有互斥引起的。

#8


哎,代码太多,唯一跟文本io有关的

#9


哎,代码太多,唯一跟文本io有关的,就是这个函数,也是用的最多最频繁的,是不是跟这个有关?
procedure writelnlogfile(str : string);
begin
    try
      writeln(Logfile,Formatdatetime('yyyy-mm-dd hh:mm:ss',now())+' '+str);
      Flush(Logfile);
    except
    end;
end;

#10


1.程序没有释放内存机制,导致程序占用系统越来越多的内存,最后导致崩溃。

2.程序对I/O设备使用后,没有释放使用权,而导致下一周期调用I/O设备的时候出错。——这个 也有可能是设备端口本身的稳定性导致的。

根据提供的图片,推测极有可能是由于原因2引起的。调用端口之前一定要加入检测端口是否空闲的代码