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

مشكله عند تنفيذ داله طويله ..

مغلق
بدأه دون سيلفاتور في 13 سبتمبر 2006 · 10 رد · 895 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

كيف حالكم يا اعضاء المنتدى ... وحشتوني والله ..

المهم انا جاي لكم اليوم وانا عندي سؤال ..

عندما اكتب دالة تحتوي على تكرار بالقيم او تكون دالة طويله .. فإن البرنامج لا ينفذ اي شيئ اخر ...

مثال ...

في هذا الكود :

for(int aa=0; aa<=10000;aa++)
{
label1.Text=aa.ToString();
}

لا يقوم بتنفيذ الجزء label1.Text=aa.ToString(); ... الا بعد الانتهاء من عملية ال Loop

فانا الان عندي مشكله ..

لاني اريد عمل progressBar واريد ايضا معرفة القيمة الحاله للمتغير aaa

وشكرا جزيلا لكم ..

abo_alzobaer@hotmail.com

#2

أخي الكريم

البرنامج يقوم بتنفيذ الأمر لكن بسبب سرعة التنفيذ لا ترى سوى الرقم الأخير..

لكن جرب تستخدم التايمر، راح أجربه وأخبرك..

#3

السلام عليكم و رحمة الله و بركاته

السبب في ما يحدث في المثال الذي أرفقته هو كما وضح الأخ عبدالله

في هذا المثال اذا أردت رؤية النص يتغير بقيمة المتغير يمكنك استخدام الكود التالي

			for (int i = 0; i < 1000; i++)
			{
				label1.Text = i.ToString();
				label1.Refresh();
			}

حيث بعد زيادة قيمة المتغير نجبر ال Label على اعادة رسم نفسه فورا باستخدام الدالة Refresh

و فوق كل ذي علم عليم

#4

جميل جداً

شكرا لك أخي C# Developer

#5

العفو أخي الكريم

و فوق كل ذي علم عليم

#6

تحذير، امامك مطبات برمجيه :D

شرح اسباب المشكله : عندما تقوم بعمليه اللوب فانه لايعطي النظام فرصه التجاوب مع الاحداث الاخرى (تحديث ، احداث الماوس او لوحه التحكم ...) الا بعد النتهاء من عمليه اللوب ... اي بمعنى آخر يكون البرنامج في حاله تعليق حتى ينتهي اللوب (جرب تحريك النافذه اثناء عمليه اللوب ، ماذا تلاحظ؟ :D ) ..

وهذا هو السبب الرئيسي للمشلكه ..

فاذا قمت بـ

   label1.Refresh();

سوف يجبر التحكم على رسم نفسه فقط ... فهذا الحل ليس بالحل المناسب في لهذا الموضع للآتي :

-- لم يقوم بحل جذور المشكله : نعم يقوم يتحديث التحكم ولكن ما زال النظام في حاله التعليق .. فلو كان اللوب الى مالانهايه فان البرنامج يدخل في حاله عدم الاستجابه (Not response ) ..

-- المشكله الآخرى هي : لو كان لدينا اكثر من اداء مثلا يتم تغيرها في اللوب ( فلنقل 15 اداء ) .. اذا 15 حاله اعاده رسم متتاليه منفصله .. وهذا يقلل من فعاليه البرنامج لان عمليه اعاده الرسم مكلفه ..

طيب ... ايش الحل بعد هذا الثرثره المتعب للعين :) ؟!! ...

الحل في :

Application.DoEvents();

وهي وضعت لهذا الغرض .. بهذا تعطي البرنامج فرصه ليقوم بالاحداث المعلقه ..

اذا الكود يكون كالتالي :

for (int i = 0; i < 1000; i++)
			{
				label1.Text = i.ToString();
				Application.DoEvents();
			}

تم تعديل هذه المشاركة بواسطة da-crystal في 14 سبتمبر 2006 في 00:10

لا مستحيل غير الوقت

#7

انت ردودك جملة يا اخ da-crystal بس العيب الوحيد فيها انك بتحبط او بتققل من شأن المشاركات الاخري

جزاك الله خيرا علي ردودك

اللهم ارزقنا فهم النبيين وحفظ المرسلين

Hock341@yahoo.com

الشركة التطبيقية لخدمات الحاسب الالي [حاسب]

http://www.hasib.com.sa

مدونتي

#8
hock كتب:
انت ردودك جملة يا اخ da-crystal بس العيب الوحيد فيها انك بتحبط او بتققل من شأن المشاركات الاخري

جزاك الله خيرا علي ردودك

:( .... اخي الكريم وحبيبي في الله ، والله لم اقصد اي تحبيط او تقليل من مشاركه او سؤال او موضوع .... فكل مافي الامر اني اقوم احاول ان اقوم به هو اني اقوم بشرح المشكله ومعرفه ابعادها ..ومن ثم وضع حل لها من واقع خبرتي ، فلا اكتفي بكتابه الكود . لانه هنالك آخرون تكون لديهم نفس المشلكه ولكن باوجهها وابعادها الاخرى .. فيكون ردي بفائده للجميع وليس لكاتب الموضوع فقط ...

آسف جداً جداً ،، اذا اسأت لاي رد فهي بدون قصد والله ....

آخوكم / ناصر الانصاري .

لا مستحيل غير الوقت

#9

ياباشا والله التقويم او الانتقاد مني هو للمعزه بس وحبي لردودك وقرايتي ليها دايما لاني بستفيد منها

مش لللانتقاض الي يقلل منك ولا حاجة ويا سيدي اسفك ده يساوي كتر اوي

انا اللي فعلا اسف اذا كنت وضحت وجه نظري بشكل ممكن يكون ضايقك

اللهم ارزقنا فهم النبيين وحفظ المرسلين

Hock341@yahoo.com

الشركة التطبيقية لخدمات الحاسب الالي [حاسب]

http://www.hasib.com.sa

مدونتي

#10
 private void Loop()
		{
			for (int i = 0; i <= 10000; i++)
			{
				this.textBox1.Text = i.ToString();
			}

		}

		private void Form1_Load(object sender, EventArgs e)
		{
			System.Threading.Thread myThread = new System.Threading.Thread(Loop);
			myThread.Start();
		}

اذا كنت تستخدم 2005 اضف التالي الى Constructor

public Form1()
		{
			InitializeComponent();
			CheckForIllegalCrossThreadCalls = false;
		}
#11

العفو والله ياشباب لاني نسيت الموضوع ..

اصلا كنت مسوي عملية بالمستشفى :(

جزاكم الله خير الجزاء

ذا كريستال

وجافا مان

.بس محتار ..

ايش الكود الاحسن ؟

abo_alzobaer@hotmail.com

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

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