اجرای تنها یک نمونه از برنامه (Single Instance)

درود.

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

در برنامه های معمولی و کوچک این کار ضرورتی نداره و در بعضی از برنامه ها که اصلا نباید این کارو کرد مثلا adobe reader یا browser ها –  چون کاربر بتونه چند تا فایل مختلف یا سایت مختلف رو در process های جداگانه باز کنه.

اما فرض کنید برنامه شما Multi-thread هست و یا از این دست برنامه ها که به اطلاعات و منابع مشترک دسترسی دارید در نتیجه نباید در روند دسترسی به اونا خللی وارد بشه پس باید فقط یک نمونه از برنامه اصلی قابل اجرا باشه.

برای عملی کردن این کار ما به فضایی مشترک  در بین Process های مختلف در حال اجرا نیاز داریم که برای همه آنها قابل دسترسی باشه و یا به عبارتی نیاز داریم Process ها با هم ارتباط برقرار کنند (inter-process communication). در ویندوز API این کار با CreateNamedPipe انجام میشه اما از اونجایی که ما با Qt عزیز کار داریم این کار با استفاده از QSharedMemory امکان پذیر هستش که البته امکاناتش فراتر از بحث ماست.

نکته لازم به توضیح اینه که هر QSharedMemory برای یکتا بودن و شناخته شدن یک کلید داره (البته نه از اون کلیدایی که ۱۰۰ روز پیش دیدیم!) و این وظیفه ماست تا کلیدو براش تعریف کنیم، این کار با تابع زیر قابل انجامه:

البته خود سازنده کلاس هم کلید را به عنوان آرگومان میگیره. در مورد کلید باید بگم که هر رشته ای میتونه باشه مثلا اسم برنامتون، اما از اونجایی که میخوایم ۱ در ۱۰۰۰~ هم امکان تکراری بودنش نباشه از GUID استفاده میکنیم- میتونید از این سایت برای تولید اون استفاده کنید.

اینم از کد اصلی که باید اول برنامه قبل از هر چیزی اجرا بشه:

تابع create هم فضا رو برای مموری اختصاص میده و اگه نتونست false بر میگردونه، دو آرگومان هم گرفته: ۱- سایز فضای مورد نظر(بایت) ۲- خواندن یا نوشتنی بودن که پیش فرضش همینه فقط برای توضیح گزاشتم.

فرض کنید برنامتون رو بار دوم اجرا کنید چون قبلا این قسمت از مموری (با کلید بالا) اختصاص داده شده پس create مقدار false برمیگردونه و بقیه ماجرا.

راستی میتونید بجای اینکه پیغام نشون کاربر بدید برنامه اولیه رو فوکوس کنید مثل همین Qt Creator خودمون که اگه دوبار اجراش کنید پنجره اولی بالا میاد. (خودتون راهشو پیدا کنید)

آه این همه توضیح برای ۴ خط کد (قابل توجه کسایی که گفتن اگه وقت کردی)

شاد باشید.

۵,۳۴۶ total views, 2 views today

Print Friendly, PDF & Email

درباره ی qtmil

میلاد هستم 23 سالمه. دانشجوی IT (ترم آخر) عاشق کامپیوتر و الکترونیک

همچنین ببینید

ریزه میزه – دسترسی به عناصر یک tuple

سلام دوستان گل. من سعی میکنم با توجه به وقت کم من و شما مطالب …

9
دیدگاه بگذارید

avatar
4 Comment threads
5 Thread replies
0 دنبال کنندگان
 
Most reacted comment
داغ ترین نخ نظرات
5 کامنت گذاران
علی ناصری میل کاریزعلی رضا پژوهشqtmilعلیرضاسعید دادخواه کامنت گذاران اخیر
  مشترک شو!  
جدیدترین قدیمی‌ترین دارای بیشترین امتیاز
میخوام باخبر شم از
سعید دادخواه
ادمین

ممنون. لطف کردید 🙂

سعید دادخواه
ادمین

کلید رو خوب اومدی 🙂http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_whistle3.gif

علیرضا
Guest
علیرضا

من هم شخصا تو بخش سوالو جواب اونو دیدم:D
حالا میبینید چه قدر خوش قدمم؟به یه سوال نگاه کردم و اونو به عوان پست گذاشتند تو وبسایت
عاقا سعید یه سوال داشتم(چرا تو دلت فحش میدی؟)من الان(دو هفته پیش) آموزش کیوت از صفر صفر رو تموم کردم
حالا به نظرتون از کجا ادامه بدم؟qml؟شبکه؟ریجستری؟یا تو همین بخش بیشتر غرق شم!؟

سعید دادخواه
ادمین

به علیرضا 🙂

برو سراغ باکس تو دی P:

نه حالا جدا بستگی به خودت داره . من که اون زمانایی که تازه با کیوت آشنا شده بودم با نوشتن بازی خیلی چیزا یاد گرفتم.

به نظر من مهم ترین کاری که الان برای تثبیت یادگیریت باید بکنی نوشتن برنامه است.برای خودت برنامه بتراش. برای خودت مسئله بتراش. 

من باید بدونم شخصیتت چطور شخصیتیه تا بتونم نظر بهتری بدم.

علیرضا
Guest
علیرضا

من یه فرد خوشتیپ،قد بلند،شجاع مثل شیر،محکم مثل شمشیر و با استعدادم:D 😀
ولی جدی جدی بیشتر دوست دارم برنامه بنویسیم مثل فتوشاپ،کروم و …. تا بازی
چون بازی بحث خیلی مفصلیه و نمیتونم تو هفت هشت ماه یاد بگیرم ولی نوشتن برنامه چیزیه که هم راحته و هم
کاربردیه و به درد میخوره و مفاهیم بسیار زیادی رو یاد میگیرم
در ضمن آموزش باکس تودی رو هم که گم کردم(لیاقت چکه میکنه)
با اجازه شما رفتیم برای یادگرفتن شبکه(البته باز هم دودلم)

سعید دادخواه
ادمین

بابا منظورم Call of Duty نبودا 🙂

با این حال من به نظرم بازی سازی ساده دوبعدی به دلیل جذابیتش واسه شروع بهتره. برنامه نویسی شبکه یه کار مکانیکیه ! ولی بازی سازی ساده این فرصت رو بهت میده که از برنامه نویسی لذت ببری. چیزی که در ابتدای امر خیلی نیازه.

علی رضا پژوهش
Member
علی رضا پژوهش

ممنون میلاد جان

علی ناصری میل کاریز
Guest

داداش دمت گرم زیاد دنبال این موضوع گشتم خداییش
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_good.gifhttp://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_good.gifhttp://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_good.gifhttp://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_rose.gifhttp://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_rose.gifhttp://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_heart.gifhttp://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_heart.gifhttp://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_mail.gif