1 ضمیمه
چک کردن باز بودن نسخه ای از برنامه، معرفی یک برنامه برای مانیتورینگ Mutex های بانام
سلام.
همون طور که می دونید با استفاده از CreateMutex می تونید کاری کنید که برنامه فقط یک بار ران بشه، به این صورت که سعی می کنید یک میوتکس بسازید و در صورت شکست یعنی قبلا برنامه ران شده. اما اگر بدون اینکه بخواهید میوتکس بسازید، فقط چک کنید ببینید که میوتکس وجود داره یا نه، چاره کار OpenMutex هست.
اما این تابع یکم کارش نیاز به توضیح داره (بعد از کلی ور رفتن و زیر و رو کردن MSDN و مانیتور کردن میوتکس ها)
کار این تابع اینه که چک می کنه ببینه قبلا میوتکسی با نامی که بهش می دید وجود داره یا نه، اگر وجود نداشت صفر بر می گردونه اما اگر وجود داشت،
یک هندل جدید می سازه و به میوتکس مورد نظر اشاره می کنه و هندل رو بهتون می ده.
این یعنی این که هندلی که CreateMutex ساخته با این هندل جدید فرق داره. و این به این معنیه که دیگه CloseHandle کردنش باعث آزاد سازی Mutex نخواهد شد.
چاره کار چیه؟ چاره اینه که موقعی که دارید چک می کنید (با OpenMutex) هندل برگشت داده شده رو همونجا ببندید.
انجام ندادن همین کار کوچیک یکی از سرویس های من رو خوابونده بود.
نمونه کد برای چک کردن وجود یک میوتکس:
function MutexExists(MutexName: PAnsiChar): boolean;
var
h: THandle;
begin
Result := false;
try
h := OpenMutex(STANDARD_RIGHTS_REQUIRED, false, MutexName);
Result := h <> 0;
finally
try
CloseHandle(h);
except
end;
end;
end;
اما معرفی یک برنامه،
برنامه Winobj:
با این برنامه می تونید لیستی از میوتکس های رجیستر شده به همراه کلی اطلاعات باارزش دیگه، از جمله درایور ها و سشن ها رو داشته باشید.
با احترام -
نقل قول: چک کردن باز بودن نسخه ای از برنامه، معرفی یک برنامه برای مانیتورینگ Mutex های بانام
حالا اگه بخواهیم هندل Mutex اصلی رو بگیریم و ببندیم، باید چه کنیم.
نقل قول: چک کردن باز بودن نسخه ای از برنامه، معرفی یک برنامه برای مانیتورینگ Mutex های بانام
باید همون خروجی CreateMutex رو نگه داشته باشی :لبخند: و اون رو CloseHandle کنی.
در حقیقت میوتکس یکیه، فقط تعدادی هندل بهش اختصاص پیدا می کنه.
باید همه هندل ها بسته باشند تا میوتکس آزاد بشه.
نقل قول: چک کردن باز بودن نسخه ای از برنامه، معرفی یک برنامه برای مانیتورینگ Mutex های بانام
نقل قول:
نوشته شده توسط
You-See
باید همون خروجی CreateMutex رو نگه داشته باشی :لبخند: و اون رو CloseHandle کنی.
در حقیقت میوتکس یکیه، فقط تعدادی هندل بهش اختصاص پیدا می کنه.
باید همه هندل ها بسته باشند تا میوتکس آزاد بشه.
منظور هندل Mutex یه برنامه دیگست دادا.
نقل قول: چک کردن باز بودن نسخه ای از برنامه، معرفی یک برنامه برای مانیتورینگ Mutex های بانام
شرمنده یوسف جان
حالا اگه بخوایم همون اول میوتکس رو بسازیم که بعد چکش کنیم باید چه کنیم ؟
ببخشید ها ، ما یک کم سواتمون پایینه :لبخند:
نقل قول: چک کردن باز بودن نسخه ای از برنامه، معرفی یک برنامه برای مانیتورینگ Mutex های بانام
با اجازه ::خجالت:
نقل قول:
شرمنده یوسف جان
حالا اگه بخوایم همون اول میوتکس رو بسازیم که بعد چکش کنیم باید چه کنیم ؟
ببخشید ها ، ما یک کم سواتمون پایینه
یه چیز تو این مایه ها میشه:
function SetMutex: boolean;var
H: Thandle;
begin
H := CreateMutex(nil, False, 'Sample');
result := False;
If not(WaitForSingleObject(H, 0) <> Wait_TimeOut) then
result := true;
end;
نقل قول: چک کردن باز بودن نسخه ای از برنامه، معرفی یک برنامه برای مانیتورینگ Mutex های بانام
این Sample همون اسم برنامه هستش دیگه؟
نقل قول: چک کردن باز بودن نسخه ای از برنامه، معرفی یک برنامه برای مانیتورینگ Mutex های بانام
نه. اصلا فرقی نمی کنه چی بدی. در حقیقت شما یک رشته یونیک رو رجیستر می کنی. این رشته برای اطمینان از این که یونیک باشه می تونه مثلا نام برنامه باشه. یا حتی می تونید GUID رو به فرم رشته ای ثبت کنید.
میوتکس تا خاموش شدن سیستم وجود داره مگر این که برنامه ای که اون رو درست کرده بسته بشه یا خودش ببندتش یا این که سایر برنامه ها میوتکس برنامه شما رو بزنن منهدم کنن!