الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة مع العنصر IdTCPServer من عناصر Indy

مغلق
بدأه mostaphadj في 4 يونيو 2007 · 9 رد · 1,277 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لا يمكن إنشاء أو تحرير كائن عند كل من الأحداث OnExecute و OnConnect و OnException للعنصر حتى في الإصدار. Indy 10.1.5 هل يمكن أن يكون ذالك خلل في عناصر Indy أم هو عمل مقصود .

لقد أرفقت مثالا لتوضيح هذه المشكلة فأرجو المساعدة في حلها لأنها تشكل بالنسبة إلي عائقا حقيقيا.

OnExecute.zip

#2

اذهب الى هذا الرابط

مكونات اندي

#3

لقد شاهدت الرابط من قبل وأعدت الإطلاع عليه مرة ثانية إلى اني لم أجد الحل لمشكلتي

شكرا على المحاولة يا بشير

#4

لقد قمت بالاطلاع على البرنامج المرفق فوق

تحليل المشكلة: الاحداث التي ذكرتها تعتمد على مبدأ أنّ كل زبون متصل يتم انشاء له thread خاص به لكي يتم معالجة طلب كل زبون على حدى

و بالتالي بعد انتهاء تنفيذ الاجرائية اي انتهاء ال thread المنشأ يقوم بتحرير جميع ال Objects التي تم انشاءها خلالها و منها ال form التي قمت بأنشاءها

لاحظ انه ينشأ ال form و بعدها تظهر و بعدها تتحرر مباشرة و ذلك لأنتهاء ال thread

إذا لا يمكن إنشاء objects ضمن هذه الاجرائية و المحافظة عليها بعد انتهاء الاجرائية لأنه سوف يتم تحريرها بشكل تلقائي عند انتهاء تنفيذها

لحل المشكلة يمكن انشاء ال form عند انشاء ال main form للبرنامج و تقوم بعمل show و hide لها

و بذلك يصبح اجراء انشاء ال Main form كما يلي

procedure TFormServer.FormCreate(Sender: TObject);
begin
  ShellExecute(Application.Handle,'Open','Client.exe','','',0);
  Form1:=TForm1.Create(Application);
end;

و الحدث OnExecute كما يلي

procedure TFormServer.TCPServerExecute(AThread: TIdPeerThread);
var Command:String;
begin
  with AThread.Connection do
  begin
	Command:= ReadLn;
	if Command= 'FormCreate' then
	begin
	  Form1.Show;
	end else
	if Command='FormFree' then
	begin
	  Form1.Hide;
	end;
	Disconnect;
  end;

end;

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#5

ولكني لا أريد أن تحميل جميع الكائنات حتى التي قد لا أحتاجها منذ بداية البرنامج دفعة واحدة والإكتفاء بإظهارها وإخفائها كما يفعل البعض عندها يبدو برنامجي الصغير وكأنه Visual Studio هذا عمل غير صائب لأسباب عديدة تعرفها أنت كمبرمج أنا أحب الصرامة في إدارة الذاكرة "إنشاء الكائنات فقط قبل الحاجة إليها والتخلص منها بعد الإنتهاء ولا أخرج عن هذا المنطلق" للحصول على أداء أفضل للبرنامج وللحفاظ على تنظيم المصدر أيضا.

ثم أصلا أنا لا أعرف مسبقا عدد الكائنات الواجب إنشائها فأنا لكل إتصال أنشأء كائن مخصص له حسب HostName (إسم الحاسوب المتصل) ولا أريد تحريره بعد قطع الإتصال إلا عندما أريد أنا ذلك.

شكرا على تحليلك للمشكلة إن تحليلك منطقي جدا ولكن ما هو غير منطقي هو أني عندما لا أقطع الإتصال "وهو عمل غير صائب إذ يجب قطع الإتصال عند الإنتها من تلقي الرسالة" المفترض أن الكائن لا يتم تحريره. ولكن يتم تحرير الكائن لسبب أجهله. أما إذا قمت بعدم قطع الاتصال من الجهتين أي من جهة Client أيضا فان السارفر يجمد تماما على الرغم من أنه يعمل بواسطة Thread . لا أفهم المنطق الذي يعمل عليه العنصر TCPServer ، ثم لو إفترضنا ومعذرة على الإطالة أن الكائن تم إنشاؤه بشكل سليم فما هو تفسير عدم القدرة على تحريره من الذاكرة ؟. إن المشكلة هنا مشكلتين مشكلة إنشاء كائن و مشكلة تحرير كائن.

مازلت أبحث عن حل جذري للمسألة فأرجو المساعدة.

#6

تم حذف كل الردود التي ليس لها فائدة علمية

من الان ساكون اكثر صرامة وساطبق القوانين دون اي انذار او تعليق

اي تعليق ليس له فائدة علمية يحذف

هذا الرد ايضا سيحذف بعد ايام

تم تعديل هذه المشاركة بواسطة B.M.AbdelAziZ في 12 يونيو 2007 في 11:33

d4baa0.gif
#7

non-thread-safe method

في الـ Help إقرأ جيداً ما كتب عن TIdBaseThread.Synchronize

حاول إستخدامها في OnExecute التابعة لـ TIdTCPServer وأخبرني ما الذي صار معك ...

ما يلي هو ما ذكر في الـ Help

Executes a method call within the main VCL thread.
procedure Synchronize(Method: TThreadMethod); overload;
procedure Synchronize(Method: TMethod); overload;

Parameters

Method: TThreadMethod

Method or thread method to be executed.

Description

Synchronize is an overloaded method in TIdBaseThread that causes the code in Method to be executed in the context of the the main VCL thread. Synchronize is used to avoid conflicts in multithreaded applications by insuring that a non-thread-safe method is called from the main thread of execution. Execution of the thread is suspended while Method is executing in the main VCL thread.

Notes

You can also protect unsafe methods using critical sections or the multi-read exclusive-write synchronizer.

شرح موجز وكل كلمة فيه موضوعة بدقة عالية ...

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#8

mostaphadj :

ألم تكن مستعجل على الحل وقالب الدنيا ...!!

ما الذي صارت إليه المشكلة الآن ..

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#9
اقتباس
في الـ Help إقرأ 'جيدا'

احتسبوها عند لله لا تتبعوها بالمن والأذى ونلو ثوابها على أي حال شكرا لكم.

لو كنا لا نلجئ إلا لـل Help أو الـ Doc لما وجدت المنتديات أصلا مشكلتي الآن أكبر قبل أن أطرها والله يشهد فضلت عدم طرح السؤال.

اللهم اجز كل واحد قدر نيته.

ولاأريد أي رد

للمشرف: إحذف الموضوع والعضوية معا

#10

لم تخبرنا هل جربت الحل باستخدام TIdBaseThread.Synchronize؟؟

بدلاً من أن تطالب بحذف الموضوع والعضوية كنت تكتب لنا ما الذي صار معك ...

أنا تعمدت عدم كتابة الحل مباشرة وذكرت لك الطريقة فقط لأتاكد من شئ وفعلاً ما كنت أتوقعه هو الذي حدث فأنت تريد حل جاهز ...

اقتباس
لو كنا لا نلجئ إلا لـل Help أو الـ Doc لما وجدت المنتديات أصلا

يبدو أنك لا تعرف لماذا وجدت المنتديات ... اللجوء للمنتديات يأتي بعد قراءة كل المعلومات حول المشكلة التي تواجهها وأول شئ تقرأه هو الـ help والـ Documents ...

إستخدم هذا الكود

اضف openform الى قسم الـ private الخاص بـ TFormServer

  private
  procedure openform;

//=====
if Command= 'FormCreate' then
	begin
	  AThread.Synchronize(openform);
	end else
	if Command='FormFree' then
	begin
	  AThread.Synchronize(Form1.Free);
	end;

//================
procedure TFormServer.openform;
Begin
  Form1:=TForm1.Create(Application);
  Form1.Show;
end;

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…