PDA

View Full Version : سوال: چگونه از اجرای دوباره برنامه جلوگیری کنیم؟



subsub
چهارشنبه 13 شهریور 1387, 22:03 عصر
با سلام

چطوری میشه از اجرای دوباره برنامه جلوگیری کرد.

یه راهش اینه که با اجرای برنامه یک value در رجیستری ساخته بشه و پس از بستن برنامه پاک بشه ولی این روش مناسب نیست چون اگه برنامه به هر دلیلی قبل از پاک کردن Value ایجاد شده، بسته بشه، برنامه کلاً از کار می‌افته.

من فکر می‌کنم باید از handle استفاده کرد ولی نمی‌دونم توی #C چطوری باید هندل و کلاس یک فرم رو بدست آورد (در واقع نمی‌دونم یک تابع API رو چطوری میشه فراخوانی کرد.)
البته اگه دات‌نت روش بهتری داشته باشه اون رو بگید.:لبخند:

Amir Oveisi
چهارشنبه 13 شهریور 1387, 22:36 عصر
جستجوووو plz
http://barnamenevis.org/forum/showthread.php?t=6202&highlight=%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C+%DB%8C%DA %A9+%D9%86%D8%B3%D8%AE%D9%87+%D8%A7%D8%B2+%D8%A8%D 8%B1%D9%86%D8%A7%D9%85%D9%87

mehdi.mousavi
چهارشنبه 13 شهریور 1387, 23:08 عصر
با سلام

چطوری میشه از اجرای دوباره برنامه جلوگیری کرد. یه راهش اینه که با اجرای برنامه یک value در رجیستری ساخته بشه و پس از بستن برنامه پاک بشه ولی این روش مناسب نیست چون اگه برنامه به هر دلیلی قبل از پاک کردن Value ایجاد شده، بسته بشه، برنامه کلاً از کار می‌افته.
من فکر می‌کنم باید از handle استفاده کرد ولی نمی‌دونم توی #C چطوری باید هندل و کلاس یک فرم رو بدست آورد (در واقع نمی‌دونم یک تابع API رو چطوری میشه فراخوانی کرد.)
البته اگه دات‌نت روش بهتری داشته باشه اون رو بگید.:لبخند:

سلام.
روش صحیح برای این منظور، استفاده از Mutex هاست. روش ذکر شده در لینیکی که bermooda عنوان کردن، کاملا اشتباه و غیر اصولی هستش. (اگر چه در پست مزبور طوری از این روش حمایت شده که خلاف حرف منو میرسونه).

Amir Oveisi
پنج شنبه 14 شهریور 1387, 15:10 عصر
من هم با شما موافقم دوست عزيز. هدف اصلي من در واقع اين بود كه رو جستجو كردن قبل از زدن تاپيك تاكيد كنم.

مهرداد تاجدینی
پنج شنبه 14 شهریور 1387, 21:36 عصر
راه حل درست !



Process[] theProcesses = System.Diagnostics.Process.GetProcessesByName(Appl ication.ProductName); //maybe add .exe at the end of Application.ProductName

if (theProcesses.Length > 1)
{
MessageBox.Show("There is already another instance of the application running");
Application.Exit();
}

Amir Oveisi
جمعه 15 شهریور 1387, 15:12 عصر
البته روش جناب تاجدینی هم روش خوب و ساده ای هست.
این هم با استفاده از Mutex:

static class Program
{
///<summary>
/// The main entry point for the application.
///</summary>
[STAThread]
static void Main()
{
bool instanceCountOne = false;

using (Mutex mtex = new Mutex(true, "MyRunningApp", out instanceCountOne))
{
if (instanceCountOne)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Application.Run(new Form1());
mtex.ReleaseMutex();
}
else
{
MessageBox.Show("An application instance is already running");
}
}
}
}
موفق باشید
jooje

mehdi.mousavi
جمعه 15 شهریور 1387, 20:04 عصر
راه حل درست !



Process[] theProcesses = System.Diagnostics.Process.GetProcessesByName(Appl ication.ProductName); //maybe add .exe at the end of Application.ProductName

if (theProcesses.Length > 1)
{
MessageBox.Show("There is already another instance of the application running");
Application.Exit();
}


سلام.
همونطور که قبلا گفتم و جناب مداح پاک کردن، این راهکار مناسبی نیست و کاملا نادرسته. جناب آقای علیرضا مداح، شما که دلیلش رو میخواستید گوش بدید؛ تا متوجه بشید: این روش کارآمد نیست چرا که وقتی Process ای با نام یکسان در حافظه وجود داشته باشه، دیگه برنامه شما اجرا نخواهد شد. چون به اشتباه فکر میکنه که instance ای از برنامه شما در حافظه هستش، در حالیکه، بطور تصادفی نام Process شما و Process دیگری یکی در اومده.

پاورقی: جناب آقای علیرضا مداح، جای اینکه نوشته منو پاک کنید؛ باید راه حلهای نادرستی که اینجا مدام عنوان میشه و عده کثیری هم از اونها دفاع میکنند رو ابتدا تشخیص داده، و سپس پاک کنید.

maalimom
شنبه 16 شهریور 1387, 18:29 عصر
عزیزم بهترین راه کنترل کردن پروسهای اجرا شده است در هنگام لود برنامه دوم است

یا هو مسنجر
maalimom@yahoo.com

Amir Oveisi
شنبه 16 شهریور 1387, 18:43 عصر
عزیزم بهترین راه کنترل کردن پروسهای اجرا شده است در هنگام لود برنامه دوم است

یا هو مسنجر
maalimom@yahoo.com

میشه دلیلتون رو هم عنوان کنید لطفا؟

mehdi.mousavi
شنبه 16 شهریور 1387, 22:07 عصر
عزیزم بهترین راه کنترل کردن پروسهای اجرا شده است در هنگام لود برنامه دوم است یا هو مسنجر
maalimom@yahoo.com

خیر! این یکی از بدترین راههاست. میتونی تو همین تاپیک دلیلشو هم بخونید.

subsub
یک شنبه 17 شهریور 1387, 00:46 صبح
ممنون از لطف دوستان

با روش Mutex مشکلم حل شد. من که این روش رو بیشتر ترجیح می‌دهم.