PDA

View Full Version : سوال: اولویت realtime برای یک Thread



mmmmmmmmmb
جمعه 11 بهمن 1392, 14:59 عصر
سلام من می خوام یک یرنامه بنویسم که در اون 2 تا thread داشته باشم با دو اولویت متفاوت . یکی real time باشه و دیگری برای مثال low . اما نمی دونم چه جوری میشه به یک thread اولویت realtime داد(توی گزینه ها همه چی هست به غیر از realtime) یعنی وقتی شروع به کار کرد تا کارش تمام نشده cpu رو رها نکنه و thread با اولویت پایین تر منتظر بمونه تا کار thread با اولویت real time تموم بشه

در کل فرض کنید thread با اولویت realtime از 1 تا 100 چا کنه و اون یکی 100 تا 200 و قاعدتا باید این جور باشه که تا زمانی که thread با اولویت realtime کارش و تموم نکرده اون یکی شروع نشه .

نیاز به جواب دقیق (لطفا):ناراحت::ناراحت:

fmehrvarzi
جمعه 11 بهمن 1392, 16:30 عصر
سلام من می خوام یک یرنامه بنویسم که در اون 2 تا thread داشته باشم با دو اولویت متفاوت . یکی real time باشه و دیگری برای مثال low . اما نمی دونم چه جوری میشه به یک thread اولویت realtime داد(توی گزینه ها همه چی هست به غیر از realtime) یعنی وقتی شروع به کار کرد تا کارش تمام نشده cpu رو رها نکنه و thread با اولویت پایین تر منتظر بمونه تا کار thread با اولویت real time تموم بشه

در کل فرض کنید thread با اولویت realtime از 1 تا 100 چا کنه و اون یکی 100 تا 200 و قاعدتا باید این جور باشه که تا زمانی که thread با اولویت realtime کارش و تموم نکرده اون یکی شروع نشه .

نیاز به جواب دقیق (لطفا):ناراحت::ناراحت:

شما نیازی به اولویت یا Priority ندارد.
شما میتونید از join استفاده کنید،
http://msdn.microsoft.com/en-us/library/95hbf2ta(v=vs.110).aspx

و یا میتونید از signaling استفاده کنید
http://tutorials.csharp-online.net/index.php?title=Thread_Signaling

که هر دو در کتاب سی شارپ نات شل 5 به زبان خیلی ساده و زیبا توضیح داده شده است.
البته مطالب Threading این کتاب در این آدرس به صورت رایگان قرار داده شده است.
http://www.albahari.com/threading/

rahnema1
جمعه 11 بهمن 1392, 17:45 عصر
سلام
این جوری هم می تونید عمل کنید
سه تا thread در برنامه عمل می کنند یکی مربوط به thread اصلی برنامه و دو تا هم که خودمون ا یجاد می کنیم
چون خاصیت Priority مربوط به threadOne برابر با Highest می باشد پس اول اجرا میشه
به طور طبیعی Priority مربوط به یک thread برابر با Normal می باشد پس thread اصلی برنامه دومی خواهد بود که تمام میشه
آخرین thread هم threadTwo خواهد بود که خاصیت Priority اون برابر Lowest قرار داده شده


using System;
using System.Threading;
namespace Thrd
{
class Program
{
public static void Main(string[] args)
{
Thread threadOne = new Thread(new ParameterizedThreadStart(ThreadMethod));
Thread threadTwo = new Thread(new ParameterizedThreadStart(ThreadMethod));
threadOne.Priority=ThreadPriority.Highest;
threadTwo.Priority = ThreadPriority.Lowest;
threadTwo.Start(new StartEnd(101,200 ));
threadOne.Start(new StartEnd(1,100 ));
Console.Write("Press any key to continue . . . \n");
Console.ReadKey(true);
}
public static void ThreadMethod( object n)
{
for (int i =((StartEnd)n).start1; i < ((StartEnd)n).end1; i++)
{
Console.WriteLine("{0}",i);
}
}
}
class StartEnd
{
public int start1, end1;
public StartEnd(int v1,int v2)
{
start1=v1;
end1=v2;
}
}
}


توضیحات لازم را می تونید از سایت مایکروسافت دریافت کنید
http://msdn.microsoft.com/en-us/library/system.threading.threadpriority(v=vs.110).aspx

mmmmmmmmmb
شنبه 12 بهمن 1392, 18:10 عصر
خيلي ممنونم ولي منظورم اینه که چه جوری می تونم یک thread با اولویت real time ایجاد کنم . من در یک مقاله خوندم که thread می تونه از لحاظ اولویت در 2 کلاس ایجاد بشه کلاس real time و کلاس variable . و اگه در کلاس real time باشه پردازنده رو رها نمی کنه تا کارش تموم بشه . من می خوام اینو به صورت عملی نشون بدم
لطفااگه کسی اطلاعی داره جواب بده . خیلی مهمه ...:ناراحت::گریه:

fmehrvarzi
شنبه 12 بهمن 1392, 19:02 عصر
لطف میکنید بیشتر توضیح بدهید،
اولویت که معادل انگلیسیش میشود Priority برای Thread فقط این چند تاست.
enum ThreadPriority { Lowest, BelowNormal, Normal, AboveNormal, Highest }
شما منظورتون را به بدترین شکل ممکن بیان کردید. :لبخند:

rahnema1
شنبه 12 بهمن 1392, 20:06 عصر
دوست عزیز این چیزی که می خواهید باید با سی یا سی پلاس پلاس نوشته بشه. توی سی شارپ نمیشه به این لینک مراجعه کنید. داکیومنت و یه سری کد را می تونید اونجا پیدا کنید http://gate.upm.ro/os/LABs/Windows_OS_Internals_Curriculum_Resource_Kit-ACADEMIC و همچنین http://msdn.microsoft.com/en-us/library/windows/hardware/ff542078(v=vs.85).aspx
و این یکی http://gate.upm.ro/os/LABs/Windows_OS_Internals_Curriculum_Resource_Kit-ACADEMIC/WindowsResearchKernel-WRK/NT_Design_Workbook/Get_Workbook/ke.doc

mmmmmmmmmb
یک شنبه 13 بهمن 1392, 20:31 عصر
ببخشید اگه نتونستم منظورم رو برسونم . من تو یک مقاله خوندم thread از لحاظ اولویت می تونه در 2 کلاس real time و variable باشه . و اگه در کلاس اولویت real time باشه cpu رو انحصاری می گیره دستش تا کارش تموم شه .من می خوام اینو عملی نشون بدم ولی در سی شارپ نمی شه اولویت realtime به thread داد فقط { Lowest, BelowNormal, Normal, AboveNormal, Highest } اینارو داره . من می خوام عملی نشون بدم که اگه thread اولویتش realtime باشه وقتی cpu رو بگیره دستش تا کارش تموم نشده thread های دیگه اجرا نشن (فرض کنید 10 تا thread داریم که یکی realtime و بقیه اولویته پایین تر دارن ) با هر زبان دیگه ای هم بشه نشون داد مشکلم حل میشه . خیلی مهمه برام لطفا جواب بدیدhttp://www.iran-eng.com/images/smilies/cry.gif

fmehrvarzi
یک شنبه 13 بهمن 1392, 22:48 عصر
ببخشید اگه نتونستم منظورم رو برسونم . من تو یک مقاله خوندم thread از لحاظ اولویت می تونه در 2 کلاس real time و variable باشه . و اگه در کلاس اولویت real time باشه cpu رو انحصاری می گیره دستش تا کارش تموم شه .من می خوام اینو عملی نشون بدم ولی در سی شارپ نمی شه اولویت realtime به thread داد فقط { Lowest, BelowNormal, Normal, AboveNormal, Highest } اینارو داره . من می خوام عملی نشون بدم که اگه thread اولویتش realtime باشه وقتی cpu رو بگیره دستش تا کارش تموم نشده thread های دیگه اجرا نشن (فرض کنید 10 تا thread داریم که یکی realtime و بقیه اولویته پایین تر دارن ) با هر زبان دیگه ای هم بشه نشون داد مشکلم حل میشه . خیلی مهمه برام لطفا جواب بدیدhttp://www.iran-eng.com/images/smilies/cry.gif

دوست عزیز در "سی شارپ" چیزی به نام realtime برای ترد نداریم، اون مرجعی را که فرمودید به ما هم معرفی کنید من توی 200 تا کتاب سی شارپ این چیزی را که شما گفتید گشتم نبود.

rahnema1
دوشنبه 14 بهمن 1392, 09:36 صبح
ببینید realtime priority و variable priority در سطح process تعیین میشه نه در سطح thread
در کل 6 طبقه برای اولویت پروسس وجود داره که عبارتند از
IDLE_PRIORITY_CLASS
BELOW_NORMAL_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
ABOVE_NORMAL_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS
که 5 تای اولی از نوع variable priority و آخری از نوع realtime priority هست
همچنین برای هر thread موجود در یک process هم 7 سطح اولویت وجود داره که فقط واسه thread های داخل همون process معناداره
THREAD_PRIORITY_IDLE
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_TIME_CRITICAL
از ترکیب کلاس و سطح اولویت در کل 32 حالت اولویت برای یک thread به وجود میاد که در این لینک توضیح داده شده
http://msdn.microsoft.com/en-us/library/windows/desktop/ms685100(v=vs.85).aspx
بنابراین شما برای اینکه اولویت از کلاس variable و realtime داشته باشید کافیه هنگام ایجاد process بگید که چه اولویتی می خواهید نه هنگام ایجاد thread
حالا کار ما اینجور میشه که دو تا فایل exe درست می کنیم که هر کدوم نماینده یک process باشند و در یکی از 1 تا 100 و در دومی از 100 تا 200 چاپ میشه
یک فایل exe دیگه درست میشه که برنامه اصلی هست که اون دوتا process دیگه را قراره ایجاد بکنه
برنامه با سی پلاس پلاس نوشته شده البته با استفاده از winapi و kernel32.dll احتمالا بشه در سی شارپ نوشت ولی اینجور سر راسته
ابتدا p1.cpp و p2.cpp را کامپایل کنید بعد هم mainp.cpp که نهایتا در یک فولدر سه تا فایل p1.exe و p2.exe و mainp.exe خواهید داشت با اجرای mainp.exe کاری که می خواهید انجام میشه


////p1.cpp
#include <iostream>
using namespace std;
int main()
{
for(int i=0;i<100;i++) cout<<i<<",";
return 0;
}




//p2.cpp
#include <iostream>
using namespace std;
int main()
{
for(int i=100;i<201;i++) cout<<i<<",";
return 0;
}





////mainp.cpp
#include <windows.h>
PROCESS_INFORMATION StartNewProcess(char *program,DWORD priority)
{
STARTUPINFO startup;
memset(&startup, 0, sizeof(STARTUPINFO));
PROCESS_INFORMATION process;
memset(&process, 0, sizeof(PROCESS_INFORMATION));
CreateProcess(program, NULL,
NULL, NULL,
FALSE,
CREATE_SUSPENDED |priority ,
NULL,
NULL,
&startup, &process);
return process;
}
int main(int argc, char **argv)
{
PROCESS_INFORMATION p1=StartNewProcess("p1.exe", REALTIME_PRIORITY_CLASS);
PROCESS_INFORMATION p2=StartNewProcess("p2.exe",IDLE_PRIORITY_CLASS);
ResumeThread(p2.hThread);
ResumeThread(p1.hThread);
CloseHandle(p1.hProcess);CloseHandle(p1.hThread);
CloseHandle(p2.hProcess);CloseHandle(p2.hThread);
return 0;
}

mmmmmmmmmb
دوشنبه 14 بهمن 1392, 20:58 عصر
خیلی خیلی ممنونم .فقط یه سوال دیگه هم داشتم همونطور که گفتید یک thread هفت(7) سطح اولویت داره . چه جوری میشه به thread اولویت THREAD_PRIORITY_TIME_CRITICAL رو داد . یعنی میشه برنامه ای نوشت که 2 تا thread داشته باشیم یکی با اولویت THREAD_PRIORITY_TIME_CRITICAL و یکی با اولویت THREAD_PRIORITY_IDLE . درسته ؟ و به نظر میاد نخی که اولویت THREAD_PRIORITY_TIME_CRITICAL رو داشته باشه انحصاری کار میکنه . درسته ؟

rahnema1
دوشنبه 14 بهمن 1392, 22:30 عصر
بله درسته میشه به thread ها هم اولویت داد(با استفاده از تابع SetThreadPriority ). دوباره به همون لینکی که در پست قبل گذاشتم نگاه کنید اولویت پایه base priority یک thread از کلاس variable با سطح THREAD_PRIORITY_TIME_CRITICAL برابر با 15 هست یعنی نه تنها اولویت اون از thread های موجود در اون process بالاتره بلکه از thread های موجود در process های با اولویت variable هم بالاتره یا حداقل مساوی با اونهاست (در صورتی که اونها THREAD_PRIORITY_TIME_CRITICAL باشند) . به اینک هم می تونید مراجعه کنید : http://msdn.microsoft.com/en-us/library/windows/desktop/ms686277(v=vs.85).aspx

mmmmmmmmmb
سه شنبه 15 بهمن 1392, 13:26 عصر
اگه همین برنامه ای که به زبان c در بالا نوشتید رو روی thread با استفاده از توضیحاتی که در بالا دادید بنویسید چه جوری میشه ؟ مثلا 2 تا thread یکی با اولویت THREAD_PRIORITY_TIME_CRITICAL و یکی با اولویت THREAD_PRIORITY_IDLE .

rahnema1
سه شنبه 15 بهمن 1392, 15:30 عصر
ما در اینجا اولویت پروسس p1 را از کلاس ABOVE_NORMAL_PRIORITY_CLASS تعریف می کنیم که مقدار آن میشه 10
و اولویت پروسس p2 را از کلاس NORMAL_PRIORITY_CLASS تعریف می کنیم که مقدار آن میشه 8
یعنی به طور پیش فرض thread هر process مقدار THREAD_PRIORITY_NORMAL را می گیرد
با این حساب چون مقدار اولویت p1 بالاتر است در نتیجه باید ابتدا p1 اجرا شود و از 1 تا صد چاپ کند
اما با اختصاص دادن اولویت به thread اصلی هر process این نظم را به هم می زنیم
اولویت thread اصلی p1 برابر THREAD_PRIORITY_IDLE قرار داده میشه که مساوی است با 1
اولویت thread اصلی p2 برابر THREAD_PRIORITY_TIME_CRITICAL قرار داده میشه که مساوی است با 15
که می بینیم p2 ابتدا اجرا میشه و بعدش هم p1

//mainp2.cpp
#include <windows.h>
PROCESS_INFORMATION StartNewProcess(char *program,DWORD priority)
{
STARTUPINFO startup;
memset(&startup, 0, sizeof(STARTUPINFO));
PROCESS_INFORMATION process;
memset(&process, 0, sizeof(PROCESS_INFORMATION));
CreateProcess(program, NULL,
NULL, NULL,
FALSE,
CREATE_SUSPENDED |priority ,
NULL,
NULL,
&startup, &process);
return process;
}
int main(int argc, char **argv)
{
PROCESS_INFORMATION p1=StartNewProcess("p1.exe",ABOVE_NORMAL_PRIORITY_CLASS);
PROCESS_INFORMATION p2=StartNewProcess("p2.exe",NORMAL_PRIORITY_CLASS);
SetThreadPriority(p1.hThread, THREAD_PRIORITY_IDLE);
SetThreadPriority(p2.hThread, THREAD_PRIORITY_TIME_CRITICAL);
ResumeThread(p1.hThread);
ResumeThread(p2.hThread);
Sleep(100);
CloseHandle(p1.hProcess);CloseHandle(p1.hThread);
CloseHandle(p2.hProcess);CloseHandle(p2.hThread);
return 0;
}

mmmmmmmmmb
سه شنبه 15 بهمن 1392, 20:00 عصر
خیلی خیلی ممنون . این کد مشکلمو حل کرد:چشمک: بازم ممنون