PDA

View Full Version : اجرای تابع با پارامتر به صورت یک Thread.



hdv212
سه شنبه 04 اردیبهشت 1386, 20:03 عصر
سلام
چطوری میشه یه تابع رو که دارای پارامتر ورودی هست رو به صورت یک Thread اجرا کرد ؟؟ راه دیگه ای هم اگه به ذهن دوستان میرسه لطفا بگین،مرسی

ghafoori
سه شنبه 04 اردیبهشت 1386, 21:04 عصر
دوست عزیز تا انجا که می دانم در theard ها تابع می تواند یک پارامتر ان هم از نوع object داشته باشد مانند کد زیر


private void Form1_Load(object sender, EventArgs e)
{
System.Threading.Thread t = new System.Threading.Thread(theard);

}
void theard(object a) { }

اگر شما بیش از یک پارمتر می خواهید من از این روش استفاده می کنم یک arraylist را به ان تابع پاس می کنم

hdv212
سه شنبه 04 اردیبهشت 1386, 21:20 عصر
خب الان شما توی کدی که نوشتی چطور ابجکت a رو به تابعت پاس میکنی ؟

hdv212
چهارشنبه 05 اردیبهشت 1386, 11:01 صبح
کسی نیست ؟

Amir Oveisi
چهارشنبه 05 اردیبهشت 1386, 13:00 عصر
مثل بقیه پارامترها !

habedijoo
چهارشنبه 05 اردیبهشت 1386, 13:34 عصر
سعی کن از کنترل BackGroundWorker استفاده کنی . یه کنترله آماده برای کار با رشته ها .

hdv212
چهارشنبه 05 اردیبهشت 1386, 13:44 عصر
بابا نمیشه ... شما یه متد تعریف کنید که یه پارامتر بگیره، بعد توی شی ThreadStart ای که ساختید این تابع رو بهش پاس کنید(البته با پارامترش)، ببینید Error میگیره .. اگه تونستید این کار رو انجام بدید، کدشو اینجا بذارید،با Backgroundworker هم کار کردم ولی اون چیزی که میخوام نیست، ببینید من با یه Thread میخوام یه فرم Loading با ارسال پارامتری از نوع String رو به کاربر نشون بدم(ShowDialog()) بعد یه سری عملیات انجام بشه، بعد Thread مورد نظر Abort بشه، این کار با Thread فقط با متدهایی میشه که از نوع Void باشه و پارامتر هم نداشته باشه، متد من Void هست ولی یه پارامتر میگیره، مشکلم اینه. مرسی

Amir Oveisi
چهارشنبه 05 اردیبهشت 1386, 14:20 عصر
اگه وقت کردم حتما میذارم کد
در ضمن به هر تعداد که بخوای میشه پارامتر پاس داد ( بصورت آرایه ای از object ها )
فردا امتحان دارم بعدا کد میذارم

hdv212
چهارشنبه 05 اردیبهشت 1386, 14:49 عصر
خداخیرتون بده .. من منتظرم

ghafoori
چهارشنبه 05 اردیبهشت 1386, 15:03 عصر
من این کد را بکار بردم درست کار می کند


private void Form1_Load(object sender, EventArgs e)
{
System.Threading.Thread t = new System.Threading.Thread(theard);
t.Start(10);

}
int a;
void theard(object a) {
a = Convert.ToInt32(a);
MessageBox.Show(a.ToString());

}

hdv212
چهارشنبه 05 اردیبهشت 1386, 16:26 عصر
ایول ... درست همونی بود که میخواستم ... مشکل همین تابع Start بود که نمیدونستم پارامترهای تابع رو اینجا باید بهش پاس کنم، بهر حال دستت درد نکنه، دست همه درد نکنه

hdv212
چهارشنبه 05 اردیبهشت 1386, 21:16 عصر
بابا یه مشکل دیگه :
من کد زیر رو به کار بردم، برنامه درست کامپایل و اجرا شد :
System.Threading.Thread th = new System.Threading.Thread(this.ShowWaitForm);
th.Start("در حال اضافه کردن آیتم ...");
this.AddData();
this.LoadData();
th.Abort();

ول نمیدونم الان که میخوام کامپایل کنم از تابعی که به Thread پاس کردم Error میگیره :
Error 2 Argument '1': cannot convert from 'method group' to 'System.Threading.ThreadStart'

البته یه Error دیگه هم میده :
Error 3 The best overloaded method match for 'System.Threading.Thread.Thread(System.Threading.T hreadStart)' has some invalid arguments

hdv212
چهارشنبه 05 اردیبهشت 1386, 22:14 عصر
بچه ها مشکلم حل شد.
در آرگومانی که به تابع ارسال میکردم، به جای String نوع Object رو جایگزین کردم مشکل حل شد ولی آخه چرا الان Error میگیرفت ؟؟ نکنه یادش رفته بوده ؟؟

ARA
چهارشنبه 12 اردیبهشت 1386, 15:35 عصر
msdn این یک راه دیگه است


Thread newThread = new Thread( new ParameterizedThreadStart(DoWork));
newThread.Start(42);


راه دیگه هم داره که استفاده از کلاس بندی و هر ترد یک شی از یک کلاس ترد که تمام متغیر هاش مختص خودش هست خواستی بیشتر کمکت کنم بگو

ahmadalli
چهارشنبه 28 دی 1390, 19:17 عصر
private void Form1_Load(object sender, EventArgs e)

{

System.Threading.Thread t = new System.Threading.Thread(theard);
object o=new object();
t.Start(o);


}

void theard(object a) { }

ahmadalli
چهارشنبه 28 دی 1390, 19:18 عصر
کلا با نوع آبجکت کار میکنن اینا با نوع های دیگه سازگار نیستن.باید یه ذره تبدیل توی کد به کار ببرید!

mohammad3062
یک شنبه 17 خرداد 1394, 00:11 صبح
با این روش می توانید هر تعداد پارامتر که خواستید به تابع بفرستید:

private void Form1_Load(object sender, EventArgs e) {
string strFirstName = "Mohammad";
string strLastName = "Ahmadi";


System.Threading.Thread td = new System.Threading.Thread
(delegate() { Function(firstName: strFirstName, lastName: strLastName); });
td.Start();
}




public void Function(string firstName, string lastName)
{
//Do Something ...
}