سفارش تبلیغ
صبا ویژن
بر دلت جامه پرهیزگاری بپوشان تا به دانش برسی [از سفارشهای خضر به موسی علیه السلام]
لوگوی وبلاگ
 

آمار و اطلاعات

بازدید امروز :3
بازدید دیروز :70
کل بازدید :844160
تعداد کل یاداشته ها : 1319
103/2/30
12:34 ص
مشخصات مدیروبلاگ
 
آذر آموزش[45]
باسلام من در شغل تدریس کامپیوتر هستم و دراکثر شاخه های کامپیوتر فعالیت دارم

خبر مایه
لوگوی دوستان
 

چگونه تشخیص دهیم که یک برنامه در حال اجراست؟ (شماره 368)

منبع : http://www.pooyeshr.com
در دلفی
گاهی پیش می آید که بخواهیم زمانی که برنامه ما در حال اجرا می باشد کاربر نتواند آن را مجددا اجرا کند . چرا که ممکن است در منابع بکار گرفته شده توسط برنامه خللی ایجاد گردد . این ترفند بخصوص در برنامه های بانک اطلاعاتی کاربرد زیادی می تواند داشته باشد چرا که اجرای مجدد برنامه و دستکاری آن در رکوردهای بانک اطلاعاتی همان برنامه ( به شرط آنکه بانک اطلاعاتی توسط اجرای اول تسخیر نشده باشد چرا که در آن صورت تا زمانیکه اجرای اول فایل را آزاد نکند دستکاری رکورد ها غیر ممکن است ) اختلالات جبران ناپذیری بوجود می آورد . پس در ابتدای کار لازم است بدانیم آیا برنامه ما در حال اجرا می باشد یا نه سپس تصمیمات لازم را اخذ کنیم . بطور مثال برای کاربر پیغام دهیم که برنامه هم اکنون در حال اجرا می باشد .

ابتدا بلاک اصلی پروژه را باز کنید . این عمل را می توانید با فشردن کلیدهای Ctrl + F12 و سپس انتخاب یونیت اصلی پروژه انجام دهید .

در ابتدا در قسمت معرفی یونیت ها یونیت Windows را اضافه کنید :


Uses Windows;


حال در قسمت تعریف متغیر ها , متغیری از نوع THandle تعریف کنید :


Var Mutex : THandle;


Mutex
یک مقدار 32 بیتی برای تشخیص یکتا بودن یک منبع می باشد.

حال به بلاک اصلی برنامه می رسیم که می بایست کد آن را به صورت زیر تغییر دهید :


begin
Mutex:=CreateMutex(nil,False,"OneCopyMutex");
if WaitForSingleObject(Mutex,0) <> wait_TimeOut then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
end.



تابع CreateMutex متغیری که از نوع THandle تعریف کرده اید را با مقدار اولیه OneCopyMutex مقدار دهی می کند . توجه داشته باشید که در واقع منظور از این مقدار دهی اولیه قرار دادن رشته OneCopyMutex در متغیر نیست بلکه متغیر برای تشخیص وجود یک کپی از یک منبع مقدار دهی اولیه می شود.

حال با استفاده از شرط if WaitForSingleObject(Mutex,0)<>wait_TimeOut then تشخیص می دهیم که آیا یک کپی دیگر از Mutex تعریف شده است یانه. که چنانچه مقدار برگشتی تابع WaitForSingleObject برابر با wait_TimeOut باشد مسلم است که برنامه در حال اجرا می باشد .