PDA

View Full Version : چند نخی با متد پارامتر دار



saed2006
پنج شنبه 17 دی 1388, 12:39 عصر
چجوری میشه یک متد پارامتر دار رو با چند نخی اجرا کرد؟

mir555
پنج شنبه 17 دی 1388, 13:14 عصر
این کد مربوط به ترد چند نخی منظورتون اینه ؟؟؟

using System;
using System.Threading;

public class Test
{
static void Main()
{
ThreadStart job = new ThreadStart(ThreadJob);
Thread thread = new Thread(job);
thread.Start();

for (int i=0; i < 5; i++)
{
Console.WriteLine ("Main thread: {0}", i);
Thread.Sleep(1000);
}
}

static void ThreadJob()
{
for (int i=0; i < 10; i++)
{
Console.WriteLine ("Other thread: {0}", i);
Thread.Sleep(500);
}
}
}

saed2006
پنج شنبه 17 دی 1388, 13:50 عصر
نه
اگر متد پارامتر داشت
یعنی اینطوری بود


static void ThreadJob( int c)
{
for (int i=0; i < c; i++)
{
Console.WriteLine ("Other thread: {0}", i);
Thread.Sleep(500);
}
}

mir555
پنج شنبه 17 دی 1388, 15:03 عصر
خوب این چی فکر کنم منظورت اینه؟؟


public class UrlFetcher
{
string url

public UrlFetcher (string url)
{
this.url = url;
}

public void Fetch()
{
// use url here
}
}

[... in a different class ...]

UrlFetcher fetcher = new UrlFetcher (myUrl);
new Thread (new ThreadStart (fetcher.Fetch)).Start();

saed2006
شنبه 19 دی 1388, 09:15 صبح
ببینید شما سازنده یک کلاس رو با چند نخی اجرا کرده اید
من میخوام یک متدی که دارهی پارامتر هست رو با چند نخی اجرا کنم

mosi_asgari
شنبه 19 دی 1388, 11:19 صبح
اگر شما بخواهید که به متد خود پارامتر اضافه کنید باید امضای متد شما که به Thread خود می دهید به صورت :


void MyMethod(object parameter)

باشد. یعنی شما پارامتر های خودتون رو به صورت یک پارامتری که از نوع object است به متد پاس کنید.برای استفاده از این نوع متدها در Thread شما باید از ParameterizedThreadStart استفاده کنید که یک delegate تعریف شده در .net است که امضای متد بالا را تعریف می کند.

روش کار به این صورت است :


object[] parameters = new object[]{subject, plainTextBody, htmlBody
};

ParameterizedThreadStart pts = new ParameterizedThreadStart(MyMethod);
Thread thread = new Thread(pts);
thread.Start(parameters);

private static void MyMethod(object data)
{
object[] parameters = (object[])data;
string subject = (string)parameters[0];
string plainTextBody = (string)parameters[1];
string htmlBody = (string)parameters[2];
{


فرض در مثال بالا این بود که متد شما به 3 پارامتر احتیاج دارد و آنها را به صورت یک آرایه به متدی که قرار است در Thread اجرا شود پاس کردیم و سپس در متد MyMethod که توسط Thread اجرا می شود آنها را از آرایه خواندیم و به نوع مربوطه cast کردیم حالا می توانید از پارامترهای خود استفاده کنید.

saed2006
شنبه 19 دی 1388, 11:29 صبح
این خطا



Error 11 No overload for 'PointOnLineAndArc' matches delegate 'System.Threading.ParameterizedThreadStart' D:\last backup\Copy (2) of main project\main project\PointsGenerat.cs 87 60 main project


رو داد

mohsen.net
شنبه 19 دی 1388, 11:55 صبح
پارامتر باید از نوع object باشه
پیغام خطا هم واضح هست
امضای تابع خودت رو درست کن

Reza_Yarahmadi
شنبه 19 دی 1388, 12:47 عصر
کد زیر رو هم امتحان کن ببین کارتو راه میندازه یا نه!

private void button1_Click(object sender, EventArgs e)
{
Thread t1 = new Thread(delegate() { ThreadJob(5); });
t1.Start();
}

static void ThreadJob(int c)
{
for (int i = 0; i < c; i++)
{
Console.WriteLine("Other thread: {0}", i);
Thread.Sleep(500);
}
}

saed2006
شنبه 19 دی 1388, 12:59 عصر
من دقیقا مانند کد شما عمل کرده ام و اون خطا رو گرفته ام
منظورتو از امضا نگرفتم
کمی بیشتر توضیخ بده

saed2006
شنبه 19 دی 1388, 13:07 عصر
کد زیر رو هم امتحان کن ببین کارتو راه میندازه یا نه!

private void button1_Click(object sender, EventArgs e)
{
Thread t1 = new Thread(delegate() { ThreadJob(5); });
t1.Start();
}

static void ThreadJob(int c)
{
for (int i = 0; i < c; i++)
{
Console.WriteLine("Other thread: {0}", i);
Thread.Sleep(500);
}
}

ممنون از پاسخت
اما وقتی از روش چند نخی استفاده میکنم کلی خطا میگیرم

Handle already exists




Attempting to call into managed code without transitioning out first. Do not attempt to run managed code inside low-level native extensibility points, such as the vectored exception handler, since doing so can cause corruption and data loss.

mir555
شنبه 19 دی 1388, 13:07 عصر
منظورش اینکه که نوع پارامتری که شما دادید و یا تعدادش با اون چیزی که تعریف کردید نمی خونه

mosi_asgari
شنبه 19 دی 1388, 13:55 عصر
void PointOnLineAndArc(object obj)
امضای متد باید به شکل بالا باشه