PDA

View Full Version : درباره Mutex , اگه ممکنه یه نمونه کد.



MSHService
شنبه 12 بهمن 1387, 09:06 صبح
سلام به همه.
من در مورد میوتکس اطلاعاتی می خواستم. اول جستجو کردم دیدم چیز بدر بخوری ندیدم مجبور شدم تاپیک زدم.
فقط میدونم جهت همزمان سازی سرنخ ها به کار میره.
ممنوم میشم اگه طرز کارش و یه نمونه کد برام بزارید.
با تشکر :خجالت:

vcldeveloper
شنبه 12 بهمن 1387, 18:11 عصر
نمونه کدش چند بار در این تالار گذاشته شده. برای توضیحات درباره Mutex هم می توانید عبارتی مثل Thread Synchronization Objects را در اینترنت جستجو کنید.

MSHService
یک شنبه 13 بهمن 1387, 07:12 صبح
اقا بخدا من پیدا نمی کنم تو این سایت هیچ کدی.
من تازه واردم.
لطفا کمکم کنید.

vcldeveloper
یک شنبه 13 بهمن 1387, 16:47 عصر
کاربرد Mutex (http://barnamenevis.org/forum/showthread.php?t=111834)
نمونه سورس کد (http://barnamenevis.org/forum/showthread.php?t=35)
استفاده از Thread ها در دلفی (http://barnamenevis.org/forum/showthread.php?t=79463)

این هم کتاب Multithreading - The Delphi Way نوشته Martin Harvey که مفصلا درباره Multithreading در دلفی ومفاهیم مربوط به آن، و Synchronization Objects (مثل Critical Section, Mutex, Semaphore, Event و غیره) توضیح داده:
http://cc.codegear.com/Item/14809

1485159
شنبه 02 خرداد 1388, 10:27 صبح
Mutex := CreateMutex(nil, True, 'MDIEditorTest');

مشکل اینجاست که من اصلا از کد بالا سر در نمیارم!!!!!!!
میشه لطف کنید بگید پارامتر هاش یه!؟..
ممنون.

Saeed_m_Farid
شنبه 02 خرداد 1388, 13:45 عصر
مشکل اینجاست که من اصلا از کد بالا سر در نمیارم!!!!!!!
میشه لطف کنید بگید پارامتر هاش یه!؟..
ممنون.برای اینکه بتونین از کد بالا سر در بیارید باید با حداقل های مقدمات سیستم عامل آشنا باشید، سیستم عامل برای دسترسی همزمان (Synchronize Access) پروسسها (مثلا برنامه شما) به منابع سیستمی، از آبجکتهای (اشیاء طراحی شده به این منظور) متعددی استفاده می نماید، بعنوان مثال نواحی بحرانی (Critical Section) ، سمافور، میوتکس و ...
روال همزمانی، برای این طراحی می شود که چند سرنخ (Thread) از یک یا چند پروسس، با دستیابی همزمان به یک قسمت از منابع سیستم (بعنوان مثال بخشی از حافظه)، با تاثیرگذاری همزمان باعث اختلال کار دیگری نگردند؛ در اینجا از سایر موارد چشم پوشی کرده و فقط در مورد آبجکت موردنظر (Mutex) توضیح کوتاهی داده می شود:

------------------------------------------------------------------------------------------------

Mutex : mutual exclusion object
به آبجکتی گفته می شود که بوسیله آن چند سرنخ قابلیت استفاده مشترک از منابع سیستمی مانند حافظه، سیستم فایل، منابع سخت افزاری و ... را فراهم می نماید. عموماً هنگام اجرای یک برنامه (پروسس)، این برنامه یک میوتکس برای تخصیص منابع سیستمی در ابتدا ایجاد کرده و از سیستم عامل درخواست قفل نمودن منابع تخصیص یافته برای خود را می نماید به این طریق سایر سرنخ ها هنگام کار این برنامه به منابع موردنظر دستیابی نخواهند داشت، درصورت قفل بودن میوتکس قبل از درخواست پروسس موردنظر، معمولاً سیستم عامل، برنامه درخواست کننده جدید برای میوتکس مشابه (با همان نام یا مشخصه) را در صف انتظار قرار میدهد و کنترل تا زمانیکه میوتکس موردنظر آزاد نشده باشد، به برنامه موردنظر داده نخواهد شد. در نهایت هنگامی که داده ها مورد نیاز میوتکس نبودند یا روال کاری برنامه به اتمام برسد، میوتکس آزاد شده و منابع به سیستم از حالت قفل در می آیند.

------------------------------------------------------------------------------------------------
حالا درمورد CreateMutex تو دلفی :
این تابع معادل CreateMutexA در API های kernel32 میباشد و با دادن پارامترهایی که ذیلا توضیح داده خواهد شد، هندلی (مشخصه میوتکس که سیستم عامل اختصاص میدهد) که سیستم عامل برای میوتکس درخواستی ما در نظر گرفته؛ به عنوان خروجی برمی گرداند. اگر میوتکس موردنظر قبل از فراخوانی تابع، وجود داشته باشد؛ تابع GetLastError مقدار ERROR_ALREADY_EXISTS را برمیگرداند، در غیر اینصورت مقدار بازگشتی تابع GetLastError صفر خواهد بود. پس شما پس از فراخوانی CreateMutex باید مقدار بازگشتی GetLastErrorرا چک کنید تا صفر باشد در غیر اینصورت میوتکس موردنظر قبلا ایجاد شده و تا زمان اتمام کار پروسس قفل کننده منابع مورد استفاده میوتکس، شما نمی توانید به آن دستیابی کنید، مگر اینکه نسخه دیگری از پروسس موردنظر با منابع مجزا اجرا نمایید.
پارامترهای ورودی :


lpMutexAttributes : این پارامتر از نوع LPSECURITY_ATTRIBUTES (که در دلفی اشاره گر PSecurityAttributes به ساختار TSecurityAttributes می باشد) می باشد و بطور خلاصه ساختاری است که مشخص می کند که هندل موردنظر قابل ارث بری توسط پروسس های فرزندِ پروسس ما می باشد یا نه، درصورتیکه نخواهید هندل میوتکس قابلیت ارث بری داشته باشد مقدار آنرا nil قرار می دهید.
bInitialOwner : این پارامتر بولی، مالک اولیه آبجکت میوتکس را معین می نماید. در صورت True بودن، برنامه درخواست کننده (برنامه ما) دستور فوری برای مالکیت میوتکس را صادر می کند. در غیر اینصورت برنامه صاحب میوتکس نخواهد بود (مالکیت با پروسس والد -مثلا کرنل سیستم عامل- خواهد بود).
lpName : نامی است که ما برای میوتکس خود درنظر می گیریم. باید توجه نمایید که نام موردنظر حساس به متن (کوجک-بزرگی) بوده و شامل هر کاراکتری غیر از '\' می تواند باشد (البته حداکثر 260 کاراکتر). اگر این نام با نام میوتکس دیگری در سیستم معادل باشد، تابع CreateMutexیک درخواست MUTEX_ALL_ACCESS به آبجکت موجود میفرستد. در اینحالت پارامتر bInitialOwner بعلت موجود بودن پروسس ایجاد کننده میوتکس موردنظر نادیده گرفته می شود و در صورت عدم اجازه پروسس ایجاد کننده میوتکس درخواستی ما (که معمولا خود برنامه ماست و ما اینکار را نمی کنیم) تابع GetLastError مقدار ERROR_ALREADY_EXISTS را برمیگرداند و مقدار بازگشتی صفر می شود. اگر این نام با نام یکی از سمافورها، رخدادها و یا file-mapping ها معادل باشد، تابع GetLastError مقدار ERROR_INVALID_HANDLE میدهد، و باز هم مقدار بازگشتی عدد مثبتی نخواهد بود، تا دستیابی همزمان به یک قسمت از منابع سیستم رخ ندهد.

در نهایت در صورتیکه شما دیگر با منابع سیستم کاری نداشته باشید، ReleaseMutex را میتوانید برای آزاد نمودن میوتکس موردنظر فراخوانی نمایید (در مواقع نادر ما چنین کاری می کنیم و باید کاملا از این موضوع مطمئن باشیم، معمولا با خاتمه کار برنامه این میوتکس بصورت خودکار توسط سیستم عامل آزاد می شود).

موفق باشید.

1485159
شنبه 02 خرداد 1388, 15:57 عصر
همه چیز رو فهمیدم به جز موارد زید :
lpMutexAttributes : این پارامتر از نوع LPSECURITY_ATTRIBUTES (که در دلفی اشاره گر PSecurityAttributes به ساختار TSecurityAttributes می باشد) می باشد و بطور خلاصه ساختاری است که مشخص می کند که هندل موردنظر قابل ارث بری توسط پروسس های فرزندِ پروسس ما می باشد یا نه، درصورتیکه نخواهید هندل میوتکس قابلیت ارث بری داشته باشد مقدار آنرا nil قرار می دهید.
bInitialOwner : این پارامتر بولی، مالک اولیه آبجکت میوتکس را معین می نماید. در صورت True بودن، برنامه درخواست کننده (برنامه ما) دستور فوری برای مالکیت میوتکس را صادر می کند. در غیر اینصورت برنامه صاحب میوتکس نخواهد بود (مالکیت با پروسس والد -مثلا کرنل سیستم عامل- خواهد بود).
ممنون. از توضیحتون

Saeed_m_Farid
شنبه 02 خرداد 1388, 16:05 عصر
همه چیز رو فهمیدم به جز موارد زید :
lpMutexAttributes : این پارامتر از نوع LPSECURITY_ATTRIBUTES (که در دلفی اشاره گر PSecurityAttributes به ساختار TSecurityAttributes می باشد) می باشد و بطور خلاصه ساختاری است که مشخص می کند که هندل موردنظر قابل ارث بری توسط پروسس های فرزندِ پروسس ما می باشد یا نه، درصورتیکه نخواهید هندل میوتکس قابلیت ارث بری داشته باشد مقدار آنرا nil قرار می دهید.
bInitialOwner : این پارامتر بولی، مالک اولیه آبجکت میوتکس را معین می نماید. در صورت True بودن، برنامه درخواست کننده (برنامه ما) دستور فوری برای مالکیت میوتکس را صادر می کند. در غیر اینصورت برنامه صاحب میوتکس نخواهد بود (مالکیت با پروسس والد -مثلا کرنل سیستم عامل- خواهد بود).
ممنون. از توضیحتون

یعنی فعلا در این حد، اولین پارامتر رو همیشه nil بدین ،دومی رو True و سومین پارامتر یه نام اختیاری هست ...

پ.ن.: همونطوریکه گفتم اینا پارامترهای CreateMutex هستن.

1485159
شنبه 02 خرداد 1388, 16:17 عصر
یعنی فعلا در این حد، اولین پارامتر رو همیشه nil بدین ،دومی رو True و سومین پارامتر یه نام اختیاری هست ...


دلیلشو نمیگید!؟.

Saeed_m_Farid
شنبه 02 خرداد 1388, 17:18 عصر
دلیلشو نمیگید!؟.


اولین پارامتر برابر nil : چون اونطوریکه من دیدم، شما تو برنامتون به احتمال قوی CreateProcess یا CreateSemaphore و ... ندارید، به همین علت لازم هم نیست که نگران ارث بری میوتکس ایجاد شده توسط برنامتون برای پروسس های فرزند باشید و برنامه فقط باید یکبار اجرا بشه ( و از طرف دیگه بتونید پارامترهای ارسالی به برنامه برای بار اول به بعد رو توسط همون یکبار اول، مدیریت کنید). پس برای این پارامتر مقداری معین نمیکنیم تا به سیستم بفهمانیم که ما نگران پروسسهای فرزند برنامه مون نیستیم!
پارامتر دوم برابر True : چون مالکیت میوتکس ایجاد شده رو به خودمون اختصاص بدیم و بتونیم دفعه بعد هم از هندلی که سیستم به اون اختصاص داده برای تصمیم گیریهای بعدی استفاده کنیم ...

1485159
یک شنبه 03 خرداد 1388, 10:04 صبح
: چون مالکیت میوتکس ایجاد شده رو به خودمون اختصاص بدیم و بتونیم دفعه بعد هم از هندلی که سیستم به اون اختصاص داده برای تصمیم گیریهای بعدی استفاده کنیم ...
ببخشید که یکم دوزاریم دیر میفته...
آخه هنوز مبتدی هستم !!!
2 ماه که کلا برنامه نویسی رو شروع کردم...
حالا منظورتون کدوم تصمیم گیری هاست!؟..

Saeed_m_Farid
یک شنبه 03 خرداد 1388, 11:24 صبح
ببخشید که یکم دوزاریم دیر میفته...
آخه هنوز مبتدی هستم !!!
2 ماه که کلا برنامه نویسی رو شروع کردم...
حالا منظورتون کدوم تصمیم گیری هاست!؟..
مثلا همون تصمیم گیریها که تو اینجا (http://barnamenevis.org/forum/showpost.php?p=727512&postcount=38) گفتم، در اون پست، قرار شد اگه میوتکس ایجاد شده همون میوتکس ما بود (میوتکسی که مالکیتش رو با True کردن پارامتر دوم به خودمون اختصاص دادیم) یعنی "نسخه ای از برنامه قبلا اجرا شده باشد"؛ پارامترها رو پاس بدیم به نسخه اجرا شده و ...

خانم/آقای 1485159 :
اولا نمیدونم شما غیر از این پستها، مطالب دیگه هم مطالعه میکنید یا نه، ولی هیچوقت به یه منبع اتکا نکنید.
ثانیا : فکر نمی کنم با 2 ماه برنامه نویسی اینجا نقطه شروع مناسبی برای شما باشه، مطمئن باشید تو سطرهای بعدی سوالهای شما خیلی بیشتر و گیج کننده تر میشن، نظر من اینه که شما فعلا روی روالهای مستقیم مرتبط با API های سیستم و کار با توابع پیچیده تمرکز نکنید و بذارید فعلا کارتون راه بیافته و زیاد به کنه اونا نرید؛ عوض اینکار سعی کنید روی اعمالی که قراره بعد دریافت پارامترهای برنامه، انجام بدین تمرکز کنید : مثلا از EM Editor الگو بردارید، یعنی مثلا یه PageControl داشته باشید که بازاء هر درخواست {دابل کلیک رو فایل موردنظر شما} یه Page جدید باز کنید و قابلیت های فونت ،فرمت ، Copy/Paste و ... رو به editor تون اضافه کنید و ...
ثالثا : اگه درس سیستم عامل پاس نکردین یا تسلط به مفاهیم پایه سیستم عامل ندارین، سعی کنید اول روی اونا انرژی بذارید؛ چون تا اینا رو ندونین از API ها چیزی سر در نمیارید ...

موفق باشید.

1485159
یک شنبه 03 خرداد 1388, 11:54 صبح
ثالثا : اگه درس سیستم عامل پاس نکردین یا تسلط به مفاهیم پایه سیستم عامل ندارین، سعی کنید اول روی اونا انرژی بذارید؛ چون تا اینا رو ندونین از API ها چیزی سر در نمیارید ...

منظورتون تو دانشگاه!؟..
نه بابا من هنوز اول دبیرستانم...
پس فعلا برم دنبال کارای ساده تر!؟..
ممنون. از راهنماییتون.

Felony
یک شنبه 03 خرداد 1388, 13:23 عصر
منظورتون تو دانشگاه!؟..
نه بابا من هنوز اول دبیرستانم...
پس فعلا برم دنبال کارای ساده تر!؟..
ممنون. از راهنماییتون.
من هم صحبت Saeed_m_Farid رو تایید میکنم ، شما وقتی 2 ماه هست که با مفاهیم برنامه نویسی آشنا شدید چرا دنبال اینجور مباحث میرید ؟ با این کار خودتون رو درگیر مسائلی میکنید که علاوه بر اینکه براتون سخته ممکنه به یادگیریتون لطمه بزنه ( شما رو از یادگیری بقیه ی چیزها دلسرد کنه ) کلی نمونه و مثال و مساله ی ساده تر و مناسب با اطلاعات شما هست که میتونید از اونها شروع کنید و یواش یواش اطلاعات خودتون رو بالا ببرید ، نه اینکه یه روزه بخواهید یه چیز مثل Microsoft Word رو بنویسید ...

تو نت کلی مرجع و مقاله در این رابطه هست ، راحت میتونید اطلاعات خودتون رو بالا ببرید و به مرور زمان به پاسخ سوالات پیچیده تر خودت برسی .

Saeed_m_Farid
یک شنبه 03 خرداد 1388, 15:16 عصر
ثالثا : اگه درس سیستم عامل پاس نکردین یا تسلط به مفاهیم پایه سیستم عامل ندارین، سعی کنید اول روی اونا انرژی بذارید؛ چون تا اینا رو ندونین از API ها چیزی سر در نمیارید ...
منظورتون تو دانشگاه!؟..
نه بابا من هنوز اول دبیرستانم...
پس فعلا برم دنبال کارای ساده تر!؟..
ممنون. از راهنماییتون.
اف تاپیک : WOW!!! واقعا بهتون تبریک میگم.
ما (یا حداقل خود من) اون زمون فقط بلد بودیم برنامه های کنسول gw-Basic یا Q-Basic بنویسیم.
{یادش به خیر اون صفحه مشکی های تحت DOS!}

موفق باشید

1485159
یک شنبه 03 خرداد 1388, 16:08 عصر
ما (یا حداقل خود من) اون زمون فقط بلد بودیم برنامه های کنسول gw-Basic یا Q-Basic بنویسیم.

آخه اون موقع با الان فرق میکنه!!!
من خودم وقتی خودمو با بعضی (تاکید میکنم که بعضی ) از هم سنام مقایسه میکنم میبینم که هیچی نمیدونم...

Felony
یک شنبه 03 خرداد 1388, 21:07 عصر
آخه اون موقع با الان فرق میکنه!!!
من خودم وقتی خودمو با بعضی (تاکید میکنم که بعضی ) از هم سنام مقایسه میکنم میبینم که هیچی نمیدونم...
دوست عزیز ره 100 ساله رو نمیشه یک شبه طی کرد ، شما نمیتونی در عرض 2 ماه همه چی رو یاد بگیری ، اون دوستان هم سن و سال شما هم یک شبه این چیزها رو یاد نگرفتن .