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

تحدي While بدون تعليق

بدأه المظفر بالله في 15 نوفمبر 2008 · 11 رد · 1,122 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بســم الله الـرحمــن الرحيــم

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

يا رب الاقي اجابة هالمرة

انا عندي دوران , هذا الدوران بقوم بعمل تنزيل ملف من الانترنت

طبعا ينزل اموره تمام

لكن خلال الدوران

يعلق البرنامج لحتى يخلص

طيب افرض اني لدي ملف كبير

اريد معرفة الطريقة لجعل الدوران شغال وما يعلق البرنامج

مثل برامج التنزيل بالضبط

يشتغل البرنامج بدون ما يعمل اي اشكالية

اعتقد ربما الطريقة لا تحتاج دروان نهائي

بس لازم اعرف الطريقة

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

string link = "/index.php";
 FileStream fs = new FileStream(".\\file.html",FileMode.Create,FileAccess.Write);
			 byte[] buf = new byte[8192];
			 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(link);
			 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
			 Stream resStream = response.GetResponseStream();
			 int count = 0;
			 do
			 {
				 count = resStream.Read(buf, 0, buf.Length);
				 if (count != 0)
				 {
					 fs.Write(buf, 0, count);
				 }
			 }
			 while (count > 0);
			 fs.Close();
#3

بارك الله فيك اخي

لكن هل من توضيح

#4

ابحث هنا في المنتدى أو من خلال Google بأي من الكلمتين السابقتين وستجد الكثير والكثير.. فقط ابحث :)

#5

استخدم Threading عن طريق:

System.Threading.Thread

أو Async Delegates عن طريق:

System.Delgate

أو Thread Pooling عن طريق:

System.Threading.ThreadPool

أو عن طريق إضافة السطر:

Application.DoEvents();

إلى الكود

do
			 {
				 count = resStream.Read(buf, 0, buf.Length);
				 if (count != 0)
				 {
					 fs.Write(buf, 0, count);
				 }
				 Application.DoEvents();
			 }

بس الطريقة دي مش قوية بما فيه الكفاية

#6
hazzoom كتب:
ابحث هنا في المنتدى أو من خلال Google بأي من الكلمتين السابقتين وستجد الكثير والكثير.. فقط ابحث :)

بارك الله فيك سافعل ان شاء الله واشوف النتيجة واجرب

بس اي الطريقتين افضل والفرق بين كل واحدة

#7

أخي الكريم

الأمر

Application.DoEvents();

لا يقوم بالفعل بإلغاء (التهنيج) اللي بيحصل في البرنامج

لكن وظيفته هي:

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

يعني هيسمح لليوزر بإنه يضغط على أي Button تاني بس مش بينفذ الأوامر الخاصة بالـ Button ده لحد ما اللوب بتاعك كله ما ينتهي. يعني يضغط أوك لكن لا ينفذ الأوامر لحد ما اللوب كله والـ Function كلها بتنتهي.

لكن الطرق التانية بتعتمد على Threading.

فكرة الـ Threading هي إن ممكن كذا أمر يتنفذوا مع بعض يعني مثلا يقرا من الملف وفي نفس الوقت بيطبع وفي نفس الوقت اليوزر بيكتب اللي هو عاوزه وبيعمل Save مثلا.

فدي هي الفكرة ببساطة

#8

انا قصدت الطريقتين :

Threadingو Asynchronization

الفروق ما هي ؟

#9

الـ Threading يعطيك حرية أكبر في الاستخدام لكن يجب استخدامه بحرص أما الـ Asynchronization فهو أقل حريه لكن أكثر أماناً وهو عبارة عن Threading لكن من داخل بنية الـ Function ذاتها, مثلاً ستجد Functions تبدأ بـ BeginXXX وأخرى تبدأ بـ EndXXX هذه تسمى Asynchronous Functions يعني بعبارة بسيطه فيها Threading منها فيها وهي لا تجعل برنامج "يهنج" كما يحدث معك لكن طبعاً ليست كل الدوال توجد منها نسخ فيها Threading منها فيها لذلك تلجأ لعمل Threading يدوياً في بعض الأحيان لعمل ما تريد, وعندما تقرأ وتجرب بنفسك ستكتشف كل شئ :)

تم تعديل هذه المشاركة بواسطة hazzoom في 19 نوفمبر 2008 في 01:20

#10

مشكور أخي hazzoom

#11

هناك مشاكل فى هذا الأمر

ألا و هو حينما تريد أن تستخدم الthreading إن لم تعطى القيمة التالية CheckForIllegalCrossThreadCalls = false

فسوف تضطر أن تستخدم الInvoke و الBeginInvoke مع الأشياء التى تحاول أن تتعامل مع الMain thread من خلال الthread الفرعى التى إنطلقت منها

و هذا أمر معقد و بيجبلى صداع نصفى :wacko:

هذا الكود من الممكن أن تستخدمه من أى مكان لكى تقوم بهذا الأمر

به 2 Method الأولى لكى تقوم بنداء دالة لها مدخلات و الدالة الثانية لكى تقوم بنداء دالة ليس لها مدخلات

namespace Threading
	{
		public delegate void ParMethod(object income);
		public delegate void Method();
		/// <summary>
		/// Provides You With Methods Help You To Make Threads (You Must Make CheckForIllegalCrossThreadCalls = Fulse)
		/// </summary>
		public static class invoker
		{
			/// <summary>
			/// Invoke Method With Parameters
			/// </summary>
			/// <param name="withParams">Delegate For Parameteriezd Method</param>
			/// <param name="param">Parameter Object Parameter</param>
			public static void ThreadWorker(ParMethod withParams, object param)
			{
				ParameterizedThreadStart threadDelegate = new ParameterizedThreadStart(withParams);
				Thread startWork = new Thread(threadDelegate);
				startWork.Start(param);
			}
			/// <summary>
			/// Invoke  Parameterless Method 
			/// </summary>
			/// <param name="paramLess">Delegate For Parameterless Method</param>
			public static void ThreadWorker(Method paramLess)
			{
				ThreadStart threadDelegate = new ThreadStart(paramLess);
				Thread startWork = new Thread(threadDelegate);
				startWork.Start();
			}


		}
	}

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

ملحوظة هذا الكود لا يحتوى على الAbord لذلك فهو متروك لمن سوف يستخدمه أن يعدل فيه كما يشاء

تم تعديل هذه المشاركة بواسطة نور (محمد نور) في 22 نوفمبر 2008 في 13:15

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#12

مشكور أخي جدا على الكود

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