PDA

View Full Version : سوال در مورد thread



mhs5862
پنج شنبه 08 تیر 1391, 11:09 صبح
با سلام خدمت برنامه نویسان عزیز
من مطالعه مبحث thread رو در C# تازه شروع کردم اما در آموزش با برنامه ای مواجه شدم که برام سوال زیادی به وجود اورد که از همکارانم هم که در زمینه thread کار کردن پرسیدم اونا هم نمی دونستم ای شد که گفتم از شما برنامه نویسان عزیز بپرسم.
برنامه به این صورت بود که دو thread را تقریف کرده و اونا رو بلافاصله پشت هم start می کند که t1.start متد Increment را از 0 تا 1000 می نویسه و t2.start متد Decrement رو از 1000 تا 0 باید write کند .
خروجی برنامه هر دفعه که run میکنم یه مدله در همه حالت ها 300 تا به صورت write شده نمایش می دهدکه بین Increment و Decrement متفاوته مثلا
سوال من اینه که چرا ابنجوریه ؟
من انتظار داشتم همه 2000 تا عدد برای رایت را نشان دهد.
با تشکر

majidrezaei2007
پنج شنبه 08 تیر 1391, 12:52 عصر
شما اونها رو کجا نمایش میدید ؟ اونها نمایش داده میشن . وقتی از thread استفاده می کنید اون تضمین میده که اجرای متد شما تموم بشه .

Mahmoud.Afrad
پنج شنبه 08 تیر 1391, 12:59 عصر
اینکه مدام نتیجه به صورت متوالی از هر دو نخ در خروجی نوشته میشه به خاطر این هست که سیستم عامل اجازه میده هر نخ مدت معینی را در حال اجرا باشه، یعنی هر نخ که از صف انتظار به سی پی یو وارد میشه مدت مشخصی در cpu میمونه و بعد از اتمام این مدت اگر هنوز کارش تمام نشده باشه از سی پی یو خارج شده و به انتهای صف انتظار میره و نخ بعدی وارد میشه. به خاطر همین نتایج به طور متوال دیده میشه.

mhs5862
شنبه 10 تیر 1391, 11:30 صبح
برنامه به صورت Consoleمی باشد و نتایج هم در پنجره CommandPrompt نمایش داده می شود ، البته یکی از همکارانم می گفت اشکال اینکه 2000 تا عدد رو نشون نمیده به خاط نمایش درConsole می باشد که به نظر من اینطور نیست

Saeed_m_Farid
شنبه 10 تیر 1391, 12:08 عصر
سورس‌اش احتمالاً 5-6 خط کد! بیشتر نیست، یا لینک بدین یا بذارین اینجا تا بشه نظر داد، "اینطوری هست...اونطوری نیست" که نمیشه، از کجا بفهمیم چی نوشتین؟
میشه راحت خروجی رو بریزید تو FileStream تا معلوم بشه از کنسول هست یا نه ...

samadblaj
شنبه 10 تیر 1391, 12:54 عصر
ببخشید من اعصابم خرد شد معذرت میخوام.

mhs5862
دوشنبه 12 تیر 1391, 10:19 صبح
in ham sourceCode:


using System;
using System.Threading;
class Tester
{
static void Main()
{
// make an instance of this class
Tester t = new Tester();
// run outside static Main
t.DoTest();

Console.ReadLine();
}
public void DoTest()
{
// create a thread for the Incrementer
// pass in a ThreadStart delegate
// with the address of Incrementer
Thread t1 = new Thread(new ThreadStart(Incrementer));
// create a thread for the Decrementer
// pass in a ThreadStart delegate
// with the address of Decrementer
Thread t2 = new Thread(new ThreadStart(Decrementer));
// start the threads
t1.Start();
t2.Start();

}
// demo function, counts up to 1K
public void Incrementer()
{
for (int i = 0; i < 1000; i++)
{
Console.WriteLine("Incrementer: {0}", i);
}
}
// demo function, counts down from 1k
public void Decrementer()
{
for (int i = 1000; i >= 0; i--)
{
Console.WriteLine("Decrementer: {0}", i);
}
}
}

Saeed_m_Farid
دوشنبه 12 تیر 1391, 13:49 عصر
احتمالاً تا حالا خودتون به جواب رسیدین! ولی کار از محکم کاری عیب نمی‌کنه:

خروجی برنامه هر دفعه که run میکنم یه مدله ...mafaman2003 (http://barnamenevis.org/member.php?71297-mafaman2003) کاملاً بدرستی، به دلیش اشاره کردن و این خاصیت Thrtead ها هست که بصورت غیر همزمان (Asynchronous (http://msdn.microsoft.com/en-us/library/2e08f6yc%28v=vs.100%29.aspx)) اجرا بشن...
برای مشکل دوم :


می‌تونین بافر Command prompt رو زیاد کنید! سمت چپ، بالا روی آیکون کلیک کنید، Properties و در tab Options مقدار Buffer Size رو بکنید 999؛ اگه بازم کم بود، Number of buffers رو بیشتر کنید: 89080
خروجی برنامه رو هدایت کنید به یک فایل متنی، مثلاً : ThreadTester.exe > Redirect.txt
از کلاس TraceSource (http://msdn.microsoft.com/en-us/library/system.diagnostics.tracesource.aspx) استفاده کنید (توضیح مفصل (http://barnamenevis.org/showthread.php?344088))، که همزمان با Console در یه فایل دیگه هم Trace بشه؛ البته میشه با یه خط کد هم این کار رو کرد ولی همون قضیه غیر همزمانی (Asynchronous (http://msdn.microsoft.com/en-us/library/2e08f6yc%28v=vs.100%29.aspx)ای) کار رو خراب می‌کنه (چون اونوقت ایجاد فایل متنی در Thraed اصلی انجام میشه و کارهای نخ‌های دیگه در جایی مجزا و ...) برای کد شما، چیزی میشه مثل این: using System;
using System.Threading;
using System.Diagnostics;
using System.IO;

namespace ThreadTester
{
class Tester
{

#region New inserted Code
// Instantiate a TraceListener for the console and one for the log file

private TraceSource logger = new TraceSource("MyTracer", SourceLevels.All);
public void AddTracer()
{
logger.Switch = new SourceSwitch("MyTracer", "All");
logger.Listeners.Remove("Default");
TextWriterTraceListener textListener =
new TextWriterTraceListener("./MyTrace.txt");
logger.Listeners.Add(textListener);
SourceLevels level = SourceLevels.All;
logger.Listeners[0].Filter = new EventTypeFilter(level);
logger.Switch.Level = level;

}

public void WriteLine(string format, params object[] log)
{
Console.WriteLine(format, log);
logger.TraceEvent(TraceEventType.Information, 10, format, log);
logger.Flush();
}

#endregion New inserted Code #1

static void Main(string[] args)
{

// make an instance of this class
Tester t = new Tester();
// run outside static Main
t.DoTest();

Console.ReadLine();
}

public void DoTest()
{
AddTracer();

// create a thread for the Incrementer
// pass in a ThreadStart delegate
// with the address of Incrementer
Thread t1 = new Thread(new ThreadStart(Incrementer));
// create a thread for the Decrementer
// pass in a ThreadStart delegate
// with the address of Decrementer
Thread t2 = new Thread(new ThreadStart(Decrementer));
// start the threads
t1.Start();
t2.Start();

}

// demo function, counts up to 1K
public void Incrementer()
{
for (int i = 0; i < 100; i++)
{
WriteLine("Incrementer: {0}", i);
}
}

// demo function, counts down from 1k
public void Decrementer()
{
for (int i = 100; i >= 0; i--)
{
WriteLine("Decrementer: {0}", i);
}
}
}
}


inhamjavab!