delphi4arab منتديات دلفي للعرب
مشكلة في منظومة على شبكة - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : مشكلة في منظومة على شبكة (/showthread.php?tid=7595)



مشكلة في منظومة على شبكة - Delphi4Us - 10-03-2016

السلام عليكم
اشتشارني احدهم قائلا عندي منظومة تعمل على شبكة وواجهتها الرئيسية فيها الاداة DBgrid تعرض بيانات الموظفين ولنقل 4000 الالاف سجل .
المهم ان طريقته هو انه جعل هناك مؤقت يقوم على تحديث هذه القائمة كل ثانية .
ولكن المنظومة صارت بطيئة بشكل كبير جدا .
من جهتي قلت له انك تقوم على تحديث البيانات في كل الاجهزة الطرفية حتى وان كانت غير مشغولة .
اي تنقل البيانات بين الاجهزة بلا داع .
لذلك اعطيت حلول .
1. اجعل زر للتحديث كلما اراد احد تحديث البيانات ينقر على الزر
2. لا تحدث الا البيانات التي في الصورة فقط قلت لماذا تحدث 4000 سجل بينما الذي على الشاشة عشرون .
3. اجعل مؤقت يتحسس حركة الفأرة ولوحة المفاتيح اذا توقفت عن العمل لا تحدث البيانات للاجهزة هذه
4. الابتعاد عن استخدام الامر Locate في البحث لانه يجلب كل البيانات تم ينتقل الى السجل المطلوب واستخدام الاستعلام المباشر

هذه بعض النصائح .
هل هي صحيحة ام هناك طرق اخرى .


RE: مشكلة في منظومة على شبكة - محمد الدرة - 10-03-2016

نعم كلها صحيحة
كذلك عند اعادة الاستخدام مرة اخرى سوى كانت بمؤقت او بزر تاكد من استخدام الامر
adodable.disablecontrol
لايقاف ارتباط القريد او اي مكون متصل بالبيانات وهذا يؤثر في سرعة العرض


RE: مشكلة في منظومة على شبكة - Manarsoft - 10-03-2016

هناك طريقة أخرى للتخلص من إستهلاك موارد النظام
التايمر او المبرمج لايقومان بالتخلص من موارد النظام التي استهلكت ويتركانها تتراكم
لقد حدث لي هذا في برنامج تسيير مقهى الانترنت
الحل هو : استدعاء الامر Free

مثال بسيط:

في هذا المثال يمكن لبرنامجي أن يستهلك مقدارا من موارد النظام بمرور الوقت ويتظاعف ذلك تدريجيا

Label1.Caption := IntToStr(StrToInt(Label1.Caption) + 1);
if Label1.Caption = '3' then
begin
Timer1.Enabled := False;
Label1.Caption := '0';
end;

المثال التالي يتم التخلص من المشكل بتحرير موارد النظام
Label1.Caption := IntToStr(StrToInt(Label1.Caption) + 1);
if Label1.Caption = '3' then
begin
Timer1.Enabled := False;
Label1.Caption := '0';
Timer1.FreeOnRelease();
end;


RE: مشكلة في منظومة على شبكة - Delphi4Us - 12-03-2016

(10-03-2016, 07:50 PM)Manarsoft كتب : هناك طريقة أخرى للتخلص من إستهلاك موارد النظام
التايمر او المبرمج لايقومان بالتخلص من موارد النظام التي استهلكت ويتركانها تتراكم
لقد حدث لي هذا في برنامج تسيير مقهى الانترنت
الحل هو : استدعاء الامر Free

مثال بسيط:

في هذا المثال يمكن لبرنامجي أن يستهلك مقدارا من موارد النظام بمرور الوقت ويتظاعف ذلك تدريجيا

Label1.Caption := IntToStr(StrToInt(Label1.Caption) + 1);
if Label1.Caption = '3' then
begin
Timer1.Enabled := False;
Label1.Caption := '0';
end;

المثال التالي يتم التخلص من المشكل بتحرير موارد النظام
Label1.Caption := IntToStr(StrToInt(Label1.Caption) + 1);
if Label1.Caption = '3' then
begin
Timer1.Enabled := False;
Label1.Caption := '0';
Timer1.FreeOnRelease();
end;

كم برأيك سيستهلك التايمر من موارد
لا اعتقد انه بهذه الاهمية في استهلاك الموارد
ولكن البيانات هي التي تسبب مشكلة


RE: مشكلة في منظومة على شبكة - Manarsoft - 12-03-2016

أنا قلت لك بمرور الوقت يتم استهلاك موارد النظام
البيانات لا تسبب أي مشكلة، ولو كانت تسبب مشكلة فما الداعي لتطوير قواعد بيانات ضخمة كـOracle و MySQL وغيرها؟
هناك قواعد بيانات تحتوي على كمية لا حصر لها من السجلات ول نسمع يوما أن الكمية سببت مشكلة
في أحد الويبينار لشركة PCSOFT قاموا بتجربة قاعدة بيانات تحتوي على ملايير السجلات
أحد البنوك السويسرية تقول أن أنظمتها تعالج أكثر من 150 مليون طلب يوميا.
DevExpress تقول أنها تقوم بإجراء إستعلام لمليون سجل في الوقت الحقيقي بدون مشكل.
أنا جربت قاعدة بيانات بها 10000 سجل بدون مشكل في الفلترة


RE: مشكلة في منظومة على شبكة - Delphi4Us - 13-03-2016

يا اخي انت تتحدث عن برنامج يعمل على جهاز واحد

ونحن نتحدث عن برنامج يعمل على شبكة قد تكون قريبة لعشرات الامتار وقد تكون لمئات الامتار .

وهذه ستكون البيانات في نقلها مشكلة .
خاصة بعد ان تنقلها بين الاجهزة كل ثانية .

وانا احدتك عن واقع عملي لمنظومة صديق .

والتايمر الذي سيعمل على جهاز العميل سيستهلك جزء بسيط لا يذكر من موارد الجهاز .
ولا يتم ايقافه لتحريره من الذاكرة .
لانه يعمل على طول .
ولو انه يتم انشاءه تم غلقه بشكل متكرر لقلت ربما .

وبالنهاية عملية نقل البيانات الكثيرة ستكون عبئ على السيرفر .
لانه سيستقبل الكثير من الطلبات من الاجهزة الطرفية كل ثانية .
ويقوم باعدادها وارسالها .
ولا اتحدث عن جودة قواعد البيانات وفي قدرتها التخزينية .

تم انت تتحدث عن سيرفرات سويسرية لبنوك انت تتحدث عن سيرفرات عملاقة .
والسيرفرات التي بالادارات هنا اجهزة عادية لا ترقى الى تلك


RE: مشكلة في منظومة على شبكة - محمد عبد العزيز - 13-03-2016

إقتباس :منظومة تعمل على شبكة وواجهتها الرئيسية فيها الاداة DBgrid تعرض بيانات الموظفين ولنقل 4000 الالاف سجل
المسالة من البداية خطأ: وضع DBGrid كواجهة لبرنامج يعمل على الشبكة!
في برمجة الشبكات القاعدة عامة تقول
لا تتصل الا عند الحاجة
لا تبقى متصلا لوقت طويل (اتصل، اقضي حاجتك ثم اقطع الاتصال)
عند الاتصال اطلب فقط ما تحتاج من بيانات
ان كنت تتصل كثير استخدت Connection Pooling
حاول جعل منطق العمل business logic ما استطعت بجهة الخادم Server
انسى مكونات TTable فكر فقط باستعلامات SQL ما استطعت!
...
نعود للموضوع 4000 الاف سجل ليس بالعدد الكبير يمكن الاتصال والحصول عليها خلال ثوان، المشكل بمنطق عمل البرنامج
انسى فكرة استخدام Timer واستخدم ما توفره لك قاعدة البيانات المستخدمة مثلا Events مع Firebird
http://www.firebirdsql.org/file/documentation/papers_presentations/Power_Firebird_events.pdf


RE: مشكلة في منظومة على شبكة - Delphi4Us - 19-03-2016

[quote='B.M.AbdelAziZ' pid='37638' dateline='1457857155']
إقتباس :انسى فكرة استخدام Timer واستخدم ما توفره لك قاعدة البيانات المستخدمة مثلا Events مع Firebird
http://www.firebirdsql.org/file/documentation/papers_presentations/Power_Firebird_events.pdf

هل هذا يعني انه وبواسطة مكون مختص بالـ Event مع مكونات مثل زيوس مثلا يمكن للبرنامج في جهاز طرفي ان يقتنص حدث تحديث لسجل او اضافة او حذف...؟

بحيث يقوم بتحديث البيانات فقط اذا حدث تحديث للبيانات بقاعدة البيانات .