Out Of Memory
#1
سلام الله عليكم

أقوم بمعالجة ملف نصي و حساب مجموعة إحصاءات من خلاله و أعرضها في جدول في الذاكرة و عند الإنتهاء من الحساب وضعت زر لكي أقوم بمسح محتوى الجدول و الذاكرة لكي لا حظت أن الذاكرة لا تمسح و هذا لما أعيد بعث حساب آخر فيطلع رسالة "Out Of Memory ".

أين الخلل يا ترى ؟

أرفق كود المسح

PHP كود :
repeat
table1
.Delete;
table1.Last;
until table1.Bof;
button1.Enabled:=true;
table1.Free; 
الرد
#2
و عليكم السلام ورحمة الله وبركاته ،
أظن أخي الحبيب أن المشكلة في الحلقة المستعملة ،
ألا ترى أن حلقة Repeat --- Until تقوم بتنفيذ العملية ثم بعد ذلك تتأكد من شرط الصحة ؟
لماذا لا تستعمل حلقة While ؟
كود :
Table1.First ; While Not Table1.EOF do begin Table1.Delete ; Table1.Next ; end ;

هذه كانت فكرتي فقط Smile ، بالتوفيق أخي الحبيب.
اللهم اجعلني من أهل القرآن ، الذين هم أهلك و خاصتك.
تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.
الرد
#3
شيء آخر، عندما تقوم بـ Table1.Delete لست بحاجة إلى table1.Last أو Table1.Next
كود :
while not Table1.IsEmpty do Table1.Delete;
أستبعد أن يكون الكود أعلاه سبب الخلل في التعامل مع الذاكرة.
الرد
#4
وعليكم السلام ورحمة الله

ما ذكرته ناقص ولا يكفي لايجاد مكان الخطأ
عامة: هل استدعيت .create ؟ ان نعم، لم تنسى استدعاء .free
الرد
#5
شكرا لكم

على العموم رسالة الخطأ تحدث معي في خادم واحد فقط هذا ما لاحظته و أظن أن المشكل ليس من كود المسحSad


B.M.AbdelAziZ كتب :
عامة: هل استدعيت .create ؟

لا لم أستدعي create وما هو دورها ؟

B.M.AbdelAziZ كتب :
لم تنسى استدعاء .free

أستبدلت الكود السابق بـ:

PHP كود :
begin
table1
.close;
button1.Enabled:=true;
end; 
الرد
#6

إقتباس : رسالة الخطأ تحدث معي في خادم
ما كمية المعلومات المعالجة ؟ وكيف ؟
إقتباس :ّcreate وما هو دورها ؟
للانشاء شيئ ما، مثل
كود :
var Lst : TStringList; begin Lst := TStringList.Create; ...
الأكواد التي ذكرتها لا علاقة لها بالامر
الخطأ بالكود الذي لم تذكره اما قبل او بعد
الرد
#7
هذا هو الكود الذي يسبق الكود المدرج سابقا و كل كود موضوع على زر مستقل .

لا يوجد كود من بعد :

PHP كود :
procedure TForm2.Button1Click(Sender: TObject);
begin
  D1
:=datetimepicker1.DateTime;
  
D11:=datetimepicker1.DateTime;
  
D2:=datetimepicker2.DateTime;
  
D21:=datetimepicker2.DateTime;
  
L:=TStringList.Create;
  
S:=TStringList.Create;
    if 
FileExists(ExtractFilePath(Application.ExeName)+'IVRResults1.txt') then
  begin
  Screen
.Cursor:= crHourGlass;
  
L.LoadFromFile(ExtractFilePath(Application.ExeName)+'IVRResults1.txt');
  
I:=0;
  
Appels_444:=0;Demande_Transfert:=0;Transfert_OTA:=0;
  
Time_O_OTA:=0;No_chanel_OTA:=0;
   
repeat
   table1
.Open;
   
table1.Insert;
   
table1.FieldByName('Date').AsDateTime:=D11;
   
table1.FieldByName('Appels_444').AsInteger:=0;
   
table1.FieldByName('Demande_Transfert').AsInteger:=0;
   
table1.FieldByName('Transfert_OTA').AsInteger:=0;
   
table1.FieldByName('No_chanel_OTA').AsInteger:=0;
   
table1.FieldByName('Time_O_OTA').AsInteger:=0;
   
table1.Post;
   
D11:=D11+1;
   
until D11=D21;
   
application.ProcessMessages;
   
L1:=L.Strings[0];
   
s.Delimiter:=',';
   
s.DelimitedText:=L1;
   
K:=s[0];
   
Date:=K[4]+K[5]+K[3]+K[1]+K[2]+K[6]+'20'+K[7]+K[8];
    
D3:=strtodate(Date);
    if  (
FormatDateTime('dd/mm/yyyy',D3) = FormatDateTime('dd/mm/yyyy',D1)) or (D3>D1) then
     begin
   repeat
   L1
:=L.Strings[i];
   
s.Delimiter:=',';
   
s.DelimitedText:=L1;
   
K:=s[0];
   
Date:=K[4]+K[5]+K[3]+K[1]+K[2]+K[6]+'20'+K[7]+K[8];
   
Hour:=S[1];
   
Subno:=S[8];
   
Apl_Name:=S[3];
   
Stat1:=copy(L1,Length(L1)-103,50);
   
Stat1_1 :=copy(Stat1,Length(Stat1)-49,1);
   if 
Stat1_1=',' then Stat1:=copy(L1,Length(L1)-102,50) else
    
Stat1:=copy(L1,Length(L1)-103,50);
    
Stat1_1:=copy(Stat1,Length(Stat1)-49,1);
    
Stat4_1:=copy(Stat1,Length(Stat1)-46,1);
    
Stat46_1:=copy(Stat1,Length(Stat1)-4,1);
    
Stat47_1:=copy(Stat1,Length(Stat1)-3,1);
    
Stat48_1:=copy(Stat1,Length(Stat1)-2,1);
  if (
FormatDateTime('dd/mm/yyyy',StrToDate(Date)) = FormatDateTime('dd/mm/yyyy',D1))
                    and (
Apl_Name='LOYALTY.Oxy')
                         and (
Stat1_1='1')
                          
then Appels_444:=Appels_444+1;
  if (
FormatDateTime('dd/mm/yyyy',StrToDate(Date)) = FormatDateTime('dd/mm/yyyy',D1))
                    and (
Apl_Name='LOYALTY.Oxy')
                         and (
Stat4_1='1')
                          
then Demande_Transfert:=Demande_Transfert+1;
  if (
FormatDateTime('dd/mm/yyyy',StrToDate(Date)) = FormatDateTime('dd/mm/yyyy',D1))
                    and (
Apl_Name='LOYALTY.Oxy')
                         and (
Stat46_1='1')
                          
then No_chanel_OTA:=No_chanel_OTA+1;
  if (
FormatDateTime('dd/mm/yyyy',StrToDate(Date)) = FormatDateTime('dd/mm/yyyy',D1))
                    and (
Apl_Name='LOYALTY.Oxy')
                         and (
Stat47_1='1')
                          
then Transfert_OTA:=Transfert_OTA+1;
    if (
FormatDateTime('dd/mm/yyyy',StrToDate(Date)) = FormatDateTime('dd/mm/yyyy',D1))
                    and (
Apl_Name='LOYALTY.Oxy')
                         and (
Stat48_1='1')
                          
then Time_O_OTA:=Time_O_OTA+1;
  if (
FormatDateTime('dd/mm/yyyy',StrToDate(Date))<> FormatDateTime('dd/mm/yyyy',D1)) then
   begin
    
if Table1.Locate('Date',D1,[]) then table1.Edit;
     
table1.FieldByName('Date').AsDateTime:=D1;
     
table1.FieldByName('Appels_444').AsInteger:=Appels_444;
     
table1.FieldByName('Demande_Transfert').AsInteger:=Demande_Transfert;
     
table1.FieldByName('Transfert_OTA').AsInteger:=Transfert_OTA;
     
table1.FieldByName('No_chanel_OTA').AsInteger:=No_chanel_OTA;
     
table1.FieldByName('Time_O_OTA').AsInteger:=Time_O_OTA;
     
table1.Post;
     
D1:=D1+1;
     
Appels_444:=0;Demande_Transfert:=0;Transfert_OTA:=0;
     
Time_O_OTA:=0;No_chanel_OTA:=0;Billing:=0;
     
end
     
else
   
i:=i+1;
   
until i=L.Count ;
   
l.Free;
   
s.Free;
if 
Table1.Locate('Date',D1,[]) then table1.Edit ;
     
table1.FieldByName('Date').AsDateTime:=D1;
     
table1.FieldByName('Appels_444').AsInteger:=Appels_444;
     
table1.FieldByName('Demande_Transfert').AsInteger:=Demande_Transfert;
     
table1.FieldByName('Transfert_OTA').AsInteger:=Transfert_OTA;
     
table1.FieldByName('No_chanel_OTA').AsInteger:=No_chanel_OTA;
     
table1.FieldByName('Time_O_OTA').AsInteger:=Time_O_OTA;
     
table1.Post;
     
Screen.Cursor:=crDefault ;
     
button1.Enabled:=false;
     
BitBtn2.Enabled:=true;
end; 
الرد
#8

أولا هذا خطأ
كود :
repeat table1.Open; table1.Insert;
غيره الى
كود :
table1.Open; repeat table1.Insert;
ثانيا هذا
كود :
if Table1.Locate('Date',D1,[]) then table1.Edit;
ان لم يجد يكتب اين ؟ اي سجل !!!
الرد
#9
تم تعديل الخطأ الأول

B.M.AbdelAziZ كتب :
ثانيا هذا
PHP كود :
if Table1.Locate('Date',D1,[]) then table1.Edit; 
ان لم يجد يكتب اين ؟ اي سجل !!!

قد ذكرت else if في الأسفل وهي نفسها D11 المذكورة أعلاه أي أنه إما يعدلها و إلا يعيد تنفيذ الحلقة

PHP كود :
else
   
i:=i+1; 

في إنتظار تنقيحك Smile
الرد
#10

هذين السطرين
كود :
l.Free; s.Free;
ضعهما عند النهاية قبل أخر End
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 2 ) ضيف كريم