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

سؤال في ال thread

مغلق
بدأه shdelpiero في 2 مايو 2007 · 4 رد · 769 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

Thread myth;
myth = new Thread(new System.Threading.ThreadStart(send_data));

هذاا الكود بيطلع ERROR لان الدالة send_data() بترجع string

وسؤالي هوا كيف يمكنني تعديل هذا الكود حيث أن الداله send_data لها return type

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

#2

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

أولا لا يوجد داعي أبدا لجعل الداله التي سوف يتم تنفيذها في thread منفصل أن تقوم بإرجاع اي بيانات

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

ودعنا نضرب مثلا كي تتضح الصوره

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

using System;
using System.Collections.Generic;
using System.Text;

namespace ThreadTest
{
	class AsyncTask
	{
		public event EventHandler<AsyncTaskEventArgs> TaskCompleted;

		public void DoSomthing() {
			// Do any Thing
			System.Threading.Thread.Sleep(1000);	// just for simulation

			// then raise the event
			RaiseTaskCompletedEvent("back again to arabteam 2000");
		}

		private void RaiseTaskCompletedEvent(string returnData) {
			if (this.TaskCompleted != null) {
				AsyncTaskEventArgs arg = new AsyncTaskEventArgs(returnData);
				this.TaskCompleted(this, arg);
			}
		}

	}
}

using System;
using System.Collections.Generic;
using System.Text;

namespace ThreadTest
{
	class AsyncTaskEventArgs : EventArgs
	{
		private string m_ReturnData;
		public string ReturnData {
			get { return m_ReturnData; }
		}

		public AsyncTaskEventArgs(string returnData) {
			m_ReturnData = returnData;
		}

	}
}

كما تلاحظ فقد تم تصميم الكلاس AsyncTask وبه وظيفه تدعي DoSomthing عندما تنتهي هذه الوظيفه من أدائها تقوم بعمل raising للحدث TaskCompleted

الذي بدوره يحمل بيانات يمكنك الإستفاده منها

وهذا هو كود إدراج هذا الكلاس في thread

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace ThreadTest
{
	public partial class Form1 : Form
	{
		AsyncTask myTask;

		public Form1() {
			InitializeComponent();

			myTask = new AsyncTask();
			myTask.TaskCompleted += new EventHandler<AsyncTaskEventArgs>(myTask_TaskCompleted);
		}

		void myTask_TaskCompleted(object sender, AsyncTaskEventArgs e) {
			MessageBox.Show(e.ReturnData);
		}

		private void button1_Click(object sender, EventArgs e) {
			Thread myThread = new Thread(new ThreadStart(myTask.DoSomthing));
			myThread.Start();
		}

	}
}

أرجو من الله أن تكون الفكره قد أتضحت

والسلام عليكم

ThreadTest.rar

29_5.gif

سورة العنكبوت

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

مشروع Arabic PHP.NET

حلم طالما كان يراودني حتي قهرته بحمد الله ليكون حقيقة

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

سلسلة أنماط التصاميم البرمجية Desgin Patterns

سلسلة أنماط التصاميم البرمجية Desgin Patterns | كتيب هذه الدروس (إعداد أحمد غريب)

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

كنترول ASP.NET DataGrid CheckBoxColumn

كنترول ProgressBar

كنترول UltraPanel

مشروع الكنترول الأنيق (إهداء للفريق العربي)

الورش الإلكترونية IT Workshops

تعقب الأخطاء error tracing

كنترول ColorPicker لمطوري الويب

RichTextBox Control لمطوري ال ASP.Net

حمل كتاب جافا سكربت عربي

#3

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

ولكن للاسف انا لا اعرف شيئا عن threading

ولذلك لم اتمكن من فهم اجابتك على موضوعي

كنت عايز اعرف بس ازاي ممكن ارجع قيمة من الدالة اللي استخدمتها في ال thread

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

#4

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

اقتباس
كنت عايز اعرف بس ازاي ممكن ارجع قيمة من الدالة اللي استخدمتها في ال thread

لا يمكنك فعل هذا بشكل مباشر

ولكن يجب الإلتفاف حول هذه المشكله بعمل متغير ما يحمل البيانات التي تريد إرجاعها , ثم تقوم بوضع قيمة هذا المتغير بعدما ينتهي هذا ال thread من العمل

كما قد وضحت لك سالفا بالمثال

ودعنا نورد مثال أخر بشكل أكثر تبسيط

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace SimpleThreadTest
{
	public partial class Form1 : Form
	{
		public Form1() {
			InitializeComponent();
		}

		private void button1_Click(object sender, EventArgs e) {
			Thread myThread = new Thread(new ThreadStart(this.send_data));
			myThread.Start();
		}

		void send_data() {
			// Do Operation
			Thread.Sleep(1500);

			// Then Assign Value into ReturnData Variable
			OnDataReturned("back again to arabteam 2000");
		}

		void OnDataReturned(string data) {
			MessageBox.Show(data);
		}

	}
}

نلاحظ أنا أخر سطر بالوظيفه send_data يقوم بإستدعاء الوظيفه OnDataReturned ويرسل لها بيانات ما ربما نحتاجها لعمل شئ ما

وبهذا نكون قد تحايلنا علي موضوع أن نرجع قيمه من الوظيفه التي تم تنفيذها في thread بعد إنتهاء تنفيذها

هذا والله أعلم

والسلام عليكم

29_5.gif

سورة العنكبوت

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

مشروع Arabic PHP.NET

حلم طالما كان يراودني حتي قهرته بحمد الله ليكون حقيقة

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

سلسلة أنماط التصاميم البرمجية Desgin Patterns

سلسلة أنماط التصاميم البرمجية Desgin Patterns | كتيب هذه الدروس (إعداد أحمد غريب)

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

كنترول ASP.NET DataGrid CheckBoxColumn

كنترول ProgressBar

كنترول UltraPanel

مشروع الكنترول الأنيق (إهداء للفريق العربي)

الورش الإلكترونية IT Workshops

تعقب الأخطاء error tracing

كنترول ColorPicker لمطوري الويب

RichTextBox Control لمطوري ال ASP.Net

حمل كتاب جافا سكربت عربي

#5

الف شكر ياباشمهندس

تسلم

استفدت كثيرا من ردودك

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

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

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