konto usunięte

Temat: Dwukrotnie otwarta aplikacja

Witam

Posiadam pewien problem z aplikacją. Używam w niej obiektu SerialPort i mam taki problem, że jak otworzę tą samą aplikację zgłasza mi błąd spod znaku "Ten sam port nie może być wykorzystywany przez dwie aplikacje" (cytat z pamięci, niestety nie zapisałem treści komunikatu).

Chciałbym jakoś temu zaradzić. Nie mogę usunąć z właściwości obiektu nazwy portu, bo VS uzna mi to za błąd.

Myślałem nad tym, by zablokować możliwość otwierania więcej niż jednej aplikacji tego rodzaju, ale prawdę mówiąc - zupełnie nie wiem jak się do tego zabrać.

Czy ktoś ma jakieś propozycje?
Marcin O.

Marcin O. Planning and
Manufacturing
Systems Specialist

Temat: Dwukrotnie otwarta aplikacja

Mariusz Klimek:
Myślałem nad tym, by zablokować możliwość otwierania więcej niż jednej aplikacji tego rodzaju, ale prawdę mówiąc - zupełnie nie wiem jak się do tego zabrać.

Czy ktoś ma jakieś propozycje?


static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

string processName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;


System.Diagnostics.Process[] pname = System.Diagnostics.Process.GetProcessesByName(processName);
if (pname.Length < 2 )
{
Application.Run(new f_Main());
}
}

to ci blokuje otwieraie dwa razy tej samej aplikacji na jednym kompieMarcin Ochoński edytował(a) ten post dnia 08.12.09 o godzinie 13:51

konto usunięte

Temat: Dwukrotnie otwarta aplikacja

Możesz też użyć muteksu

static void Main()
{
bool createdNewApp;

Mutex m = new Mutex(true, "App", out createdNewApp);

if (! createdNewApp)
{
//show a message that only one instance can be opened
return;
}

Application.Run(new Form1());

//keep the reference of the mutex alive
GC.KeepAlive(m);
}

konto usunięte

Temat: Dwukrotnie otwarta aplikacja

Marcin Ochoński:

static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

string processName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;


System.Diagnostics.Process[] pname = System.Diagnostics.Process.GetProcessesByName(processName);
if (pname.Length < 2 )
> {
Application.Run(new f_Main());
}
}

Skorzystałem z tego rozwiązania.
Dziękuję bardzo :)
Paweł Leśnikowski

Paweł Leśnikowski Senior Software
Developer

Temat: Dwukrotnie otwarta aplikacja

1. A nie brakuje m.ReleseMutex(); ?
2. GC.KeepAlive(m) jest chyba nie potrzebne.

konto usunięte

Temat: Dwukrotnie otwarta aplikacja

Paweł Leśnikowski:
1. A nie brakuje m.ReleseMutex(); ?
2. GC.KeepAlive(m) jest chyba nie potrzebne.

Dopóki aplikacja chodzi referencja mutexu musi być trzymana, i nie mamy pewności ze włączając nową instancje GC by jej nie zamiótł. Jeśli program będzie odpowiednio duży i będzie przetwarzał wiele obiektów to nie ma pewności że mutex nie zostanie przykryty przez coś innego w pewnym momencie, gdyż występuje tylko i wyłącznie jeden raz na starcie programu i nigdy nie zostanie użyty, JIT po prostu stwierdzi że ten obiekt nie jest już potrzebny i zrzuci instrukcje w miejsce mutexu w pamieci.

Co do 1 to tak faktycznie, ale wydaje mi się ze po zamknięciu aplikacji mutex zostanie zwolniony więc konieczność uwolnienia mutexu była by wtedy kosmetyką.Bartosz Adamczewski edytował(a) ten post dnia 09.12.09 o godzinie 21:20

Następna dyskusja:

Aplikacja bazodanowa do obs...




Wyślij zaproszenie do