PDA

View Full Version : باز نشدن برنامه وقتی در جال اجراست



sajjadrad
شنبه 01 آبان 1389, 18:20 عصر
سلام من میخوام وقتی برنامه در حال اجرا شدنه دیگه نسخه دیگه ای ازش اجرا نشه...مثلا کاربر نتونه دوباره با باز کردنش اجرا کنه...
تو لیست process بگرده که اگه در حال اجرا شده اجرا نشه...
مرسی

water_lily_2012
شنبه 01 آبان 1389, 18:52 عصر
این کد را در قسمت Program.cs در تابع Main بنویس.


int count = GetNumberOfRunningInstances();
if (count <= 1)
{
Application.Run(new Form1());
}
else
{
System.Windows.Forms.MessageBox.Show("Another instance of this program is already running. Two instances cannot run at the same time", "Already running", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
Application.Exit();
}

sajjadrad
یک شنبه 02 آبان 1389, 18:43 عصر
مرسی دوست عزیز...فقط وقتی دیباگ میکنم خطا زیر رو میده:


error CS0103: The name 'GetNumberOfRunningInstances' does not exist in the current context


از namespace خاصی use کردی؟

water_lily_2012
دوشنبه 03 آبان 1389, 06:19 صبح
از این سه استفاده کردم

using System;
using System.Collections.Generic;
using System.Windows.Forms;

sajjadrad
دوشنبه 03 آبان 1389, 12:33 عصر
خب اینا که بصورت پیشفرض using میشه پس چرا خطا میده؟:ناراحت:

elimeli
دوشنبه 03 آبان 1389, 14:40 عصر
خب اینا که بصورت پیشفرض using میشه پس چرا خطا میده؟:ناراحت:


این ارور واسه من بود
اگه علتشو پیدا کردید ممنون میشم بذارید همین جا

sajjadrad
سه شنبه 04 آبان 1389, 00:57 صبح
مثله اینکه GetNumberOfRunningInstances یه متده...من در بارش سرچ کردم اینو پیدا کردم:



private static int GetNumberOfRunningInstances()
{
int runcount = 0;
string[] parts = System.Reflection.Assembly.GetExecutingAssembly(). Location.Split("\\".ToCharArray());
string appName = parts[parts.Length - 1];
string query = "select name from CIM_Process where name = '" + appName + "'";
System.Management.ManagementObjectSearcher searcher = new System.Management.ManagementObjectSearcher(query);
foreach (System.Management.ManagementObject item in searcher.Get())
{
runcount++;
}
return runcount;
}


اما این کد هم کار نمیکنه چون احتمالا از نیم اسپیس خاصی استفاده میکنه:افسرده:

یکی کمک کنهههههههههههههه!:ناراحت:

razavi_university
سه شنبه 04 آبان 1389, 03:24 صبح
راه حل مشکل شما در الگوی Singleton است. لطفا جستجو بفرمایید: الگوهای طراحی- Singleton

موفق باشید

water_lily_2012
سه شنبه 04 آبان 1389, 06:09 صبح
سلام
آقا شرمنده اصلا حواس این حقیر به این تابع نبود.
برای همین کل کلاس Program .cs را براتون می گذارم. انشاالله که مرا عفو کنید.

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace Likeable_Windows
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
int count = GetNumberOfRunningInstances();
if (count <= 1)
{
Application.Run(new Form1());
}
else
{
System.Windows.Forms.MessageBox.Show("Another instance of this program is already running. Two instances cannot run at the same time", "Already running", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
Application.Exit();
}
}
private static int GetNumberOfRunningInstances()
{
//yank off the appname.exe from the assemblies location
string[] parts = System.Reflection.Assembly.GetExecutingAssembly(). Location.Split("\\".ToCharArray());
string appName = parts[parts.Length - 1];

//build the wmi query
string query = "select name from CIM_Process where name = '" + appName + "'";

//load up the managementobjectsearcher with the query
System.Management.ManagementObjectSearcher searcher = new System.Management.ManagementObjectSearcher(query);

int runcount = 0;
//iterate the collection and (which should only have 1 or 2 instances, and if 3 then its already running
//1 instaces would be itself, 2 would be self and the other
foreach (System.Management.ManagementObject item in searcher.Get())
{
runcount++;
if (runcount > 1) break; //only need to know if there is more then self running
}

return runcount;
}
}
}

sh_1366
سه شنبه 04 آبان 1389, 07:38 صبح
ManagementObjectSearcher این تابعی که استفاده کردی ایا رفرنسی خاصی استفاده کردی لطفا راهنمای کنید

water_lily_2012
چهارشنبه 05 آبان 1389, 16:16 عصر
این کد درسته. ولی به System.Managment ایراد می گیره. من فکر کردم خودتون این رفرنس را اضافه می کنید.
ولی اشکال نداره.
این نمونه برنامه.

sajjadrad
چهارشنبه 05 آبان 1389, 17:38 عصر
خب دوست عزیز این برنامه ای که شما نوشتید با .NET 2 نوشته شده و من الان از .NET 3.5 استفاده میکنم...
system manegment رو به refrence اضافه کردم اما کار نمیکنه...فکر کنم بخاطر نسخه دات نت باشه

ممنون