PDA

View Full Version : سوال: درک صحیح از کاربرد thread



بیتا حکمت
دوشنبه 11 خرداد 1394, 19:04 عصر
:لبخند:

سلام . چند مطلب در مورد thread ها خوندم اما راستش به خودم شک دارم و احساس می کنم دقیق نگرفتم داستانش چی هست .(نه مطمئن ام که نگرفتم ! )
یه سوال دارم ، فرض کنید ما چهار متد داریم ,



call method 1

call method 2

call method 3

call method 4



و هر یک از متدها ، اجراشون زمانبر هستش . مثلا هر کدوم از اینا 10000 رکورد به دیتابیس اضافه می کنن ( حتما" این تجربه رو داشتین تو این موارد برنامه حالت هنگ پیدا می کنه )
ایا thread یعنی اینکه بگیم تا اجرای متد اول تموم نشده ، متد دوم اجرا نشود ؟! اصلا" با thread می شود جلوی هنگیدن موردی رو که گفتم گرفت ؟ و ...

Javad_raouf
دوشنبه 11 خرداد 1394, 19:26 عصر
سلام
در یک کلمه عرض می کنم خدمتتون thread یک جورایی مثل این می مونه که یک برنامه مجزا در حال اجراست
یعنی مثلا وقتی دو تا Thread دارید انگار تقریبا دو تا نرم افزار مجزا دارن کار می کنن
این حرفم اصلا درست نیست ولی می خواستم مفهوم Thread رو درک کنید چون ترد ها به صورت موازی کارشون رو انجام میدن و منتظر همدیگه نمی مونن مثل نرم افزار های مجزا ولی اگر 10 تا ترد هم داشته باشید همشون توی یک نرم افزار هستن و از از منابع داخل Ram به صورت اشتراکی استفاده می کنن.
خودمم نفهمیدم چی گفتم خدا کنه شما فهمیده باشی:لبخند:
--------------------------

با thread می شود جلوی هنگیدن موردی رو که گفتم گرفت ؟
بله دقیقا کار Thread اکثرا همینه یعنی شما فرض کن متد شماره یک رو اگر بخوای توی ترد اصلی برنامت اجرا کنی زمانی که برنامه وارد متد 1 میشه تا زمانی که از متد 1 خارج نشده به هیچ کار دیگه ای نمی پردازه و این یعنی به Refresh کردن Form هم نمی پردازه که باعث در حالت هنگ رفتن برنامه ما میشه
اما وقتی از ترد مجزایی برای فراخونی متد یک استفاده کنید ترد اصلی برنامه به کار خودش می پردازه و ترد ثانویه هم به صورت موازی متد شماره یک رو اجرا می کنه
--------------------------------

ایا thread یعنی اینکه بگیم تا اجرای متد اول تموم نشده ، متد دوم اجرا نشود ؟

مفهوم ترد دقیقا برعکس اینه یعنی وقتی از 4 تا ترد استفاده کنید می تونید کاری کنید که همزمان هر 4 تا متد با هم پیش برن
یا اگر می خواین متد ها به ترتیب جلو برن ولی برنامه هنگ نکنه باید از یک ترد ثانویه استفاده کنید و چهار متد را داخل اون ترد فراخونی کنید

امیدوارم حرفام مفید باشه

بیتا حکمت
دوشنبه 11 خرداد 1394, 19:40 عصر
سلام
در یک کلمه عرض می کنم خدمتتون thread یک جورایی مثل این می مونه که یک برنامه مجزا در حال اجراست
یعنی مثلا وقتی دو تا Thread دارید انگار تقریبا دو تا نرم افزار مجزا دارن کار می کنن
این حرفم اصلا درست نیست ولی می خواستم مفهوم Thread رو درک کنید چون ترد ها به صورت موازی کارشون رو انجام میدن و منتظر همدیگه نمی مونن مثل نرم افزار های مجزا ولی اگر 10 تا ترد هم داشته باشید همشون توی یک نرم افزار هستن و از از منابع داخل Ram به صورت اشتراکی استفاده می کنن.
خودمم نفهمیدم چی گفتم خدا کنه شما فهمیده باشی:لبخند:
--------------------------

بله دقیقا کار Thread اکثرا همینه یعنی شما فرض کن متد شماره یک رو اگر بخوای توی ترد اصلی برنامت اجرا کنی زمانی که برنامه وارد متد 1 میشه تا زمانی که از متد 1 خارج نشده به هیچ کار دیگه ای نمی پردازه و این یعنی به Refresh کردن Form هم نمی پردازه که باعث در حالت هنگ رفتن برنامه ما میشه
اما وقتی از ترد مجزایی برای فراخونی متد یک استفاده کنید ترد اصلی برنامه به کار خودش می پردازه و ترد ثانویه هم به صورت موازی متد شماره یک رو اجرا می کنه
--------------------------------


مفهوم ترد دقیقا برعکس اینه یعنی وقتی از 4 تا ترد استفاده کنید می تونید کاری کنید که همزمان هر 4 تا متد با هم پیش برن
یا اگر می خواین متد ها به ترتیب جلو برن ولی برنامه هنگ نکنه باید از یک ترد ثانویه استفاده کنید و چهار متد را داخل اون ترد فراخونی کنید

امیدوارم حرفام مفید باشه

ممنونم از وقت و حوصله ای که به خرج دادین ، الان یه سوالی برام پیش اومد ، در حالت پیش فرض (بدون استفاده از ترد منظورمه ) ، دستورات در #C به ترتیب اجرا میشن ،
یا همزمان ؟!

Javad_raouf
دوشنبه 11 خرداد 1394, 20:11 عصر
ممنونم از وقت و حوصله ای که به خرج دادین ، الان یه سوالی برام پیش اومد ، در حالت پیش فرض (بدون استفاده از ترد منظورمه ) ، دستورات در #C به ترتیب اجرا میشن ،
یا همزمان ؟!
مسلما به ترتیب
یعنی خیلی به ترتیب:لبخند:
یعنی منظورم اینه که حتی یک خط کد هم به صورت یکجا اجرا نمیشه بلکه تبدیل میشه به چندین ریز دستور و به ترتیب اجرا میشن
کلا تا یک ریز دستور کوچیک اجرا نشه ریز دستور بعدی اجرا نمیشه
مثلا دستور ساده زیر:
a=b+3;
خودش تبدیل میشه به دو یا چند ریز دستور
یک ریز دستور b رو با 3 جمع می کنه و یک ریز دستور نتیجه رو در a میریزه
حالا فرش کن این دو تا ریز دستور بخوان با هم اجرا بشن مگه امکانش هست؟؟؟؟
منظورم اینه که تا قبل از اینکه b با 3 جمع نشه امکان اینکه نتیجه در a قرار بگیره وجود نداره
یا مثلا کد های زیر:
int a = 56;
int b = 57;
int c = a + b;
اصلا به نظر شما ممکنه که این دستوران همزمان اجرا بشن؟

asman.abi
دوشنبه 11 خرداد 1394, 20:22 عصر
به ترتیب
در کل روال برنامه نویسی ترتیبی هست. خط به خط اجرا میشه. منظور از خط به خط اجرا شدن یعنی کامپایلر C میاد کل کد رو میبینه کامپایل می کنه، بعد طبق همون روال خط به خط اجرا میشه.
تمام این روال تا اتمام کد خط به خط اجرا میشه و اصلا مربوط به این نمیشه سیستم من چند هسته ای یا چند پردازنده ایه. روال برنامه نویسی مشخص میکنه کد می تونه همزمانی رو در اجرای دستورات رعایت کنه یا نه.

اینجا نقش برنامه نویس مشخص میشه. هر چه سیستم پردازنده قوی ای داشته باشه نرم افزار یاری نکنه. آش همون و کاسه هم همون. تاثیر چندانی درش نیست.

chikar
سه شنبه 12 خرداد 1394, 00:16 صبح
اگه شما دو تا حلقه for داشته باشید می تونید همزمان و موازی از این دو تا حلقه for استفاده کنید ، مثلا دو حلقه 10 تایی رو در نظر بگیرید، با ترد، اعداد به صورت موازی و نزدیک به هم از حلقه ها خونده می شه، حالا نه دقیقا و صد در صد اینکه یکی از حلقه اول خونده بشه و یکی از حلقه دوم، ممکن هست دو تا از حلقه اول خونده شه و یکی از حلقه دوم، اما در کل حلقه هامون موازی جلو می رند! یه کم گیج کننده شد نه!!!:لبخند: