Proverka za running instance - standarten nachin ?

13 отговора 557 прегледа
#1

Proverka za running instance - standarten nachin ?

Ima li utvarden nachin za proverka dali prilojenieto veche e startirano - interesuvat me realizacii s MFC,API,VB no shte se radvam i na vsichko drugo :)

Отговор
в отговор на FullScream #2

Re: Proverka za running instance - standarten nachin ?

Можеш да използваш следния подход:

В InitInstance регистрираш един WNDCLASS например със ::RegisterClass(&wndcls);
като в wndcls.lpszClassName си задал някакво специфично име.
Преди кода за регистарция на гореспоменатия WNDCLASS проверяваш дали той вече не е регистриран.
Ако е, значи това не е първата инстанция на приложението.
Кодът е горе долу следния:

BOOL CMyApp::InitInstance()
{
if(::FindWindow("MyClassName", NULL))
{
//Това не е първа инстанция
return FALSE; //Следващата инстанция не се стартира
}
else
{
//Това е първа инстанция

WNDCLASS wndcls;
//Инициализация на wndcls
.........................
wndcls.lpszClassName = "MyClassName";
::RegisterClass(&wndcls);
}

...........................
return TRUE;
}

Ако в приложението имаш някакъв клас със специфично име можеш направо да проверяваш за него.

Pozdravi ot Bourgas.
Отговор
в отговор на pbourgas #3

Nai dobroto

Znachi predishniq nachin e edin ot nai dobrite.
Druga vuzmojnost e da obikolish vsi4ki procesi kato izpolzvash ToolHelp i da poluchish exe-to ot koeto sa startirani.
Nai-sigurniq nachin e 4rez CreateMurex. Togava si izbirash nqkakvo shntavo ime za Mutex i proverqvash dali e suzdaden. Imam source-ove samo na Delphi. Ako iskash shte izkaram nqkoi listing.
P.S. Ako go ima instance-a mojesh da aktivirash prozoreca mu (znaesh kak). Mnogo e polezno

by Wise Guy
[email protected]
Отговор
в отговор на WiseGuy #4

Re: Nai dobroto

S mutex-i e naj-dobroto! Ili izobsto kakawto nameble kernel object si izberesh- ako iskash dori i timer! :)). Inache towa s registratziata na prozoretza nosi sastiat smisal, obache ne wigdal zasto triabwa da se prawi po tolkowa zaobikolen nachin!
Mislia che s mutex-i ste raboti bezotkazno!
Ako iskash source code na C:
HANDLE MutexHandle;
MutexHandle=CreateMutex(NULL,FALSE,"com.direktoria.imetomi.programata.versia");
if (MutexHandle != 0)
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
MessageBox(0,"This program already running!","Already running",MB_ICONHAND);
CloseHandle(MutexHandle);
return 0;
}
else
{
//tuka e normalnata za win programata boza
};

Отговор
в отговор на Winnetou #5

Re: Nai dobroto

The FindWindow function retrieves the handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows.

HWND FindWindow(

LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);


Parameters

lpClassName

Points to a null-terminated string that specifies the class name or is an atom that identifies the class-name string. If this parameter is an atom, it must be a global atom created by a previous call to the GlobalAddAtom function. The atom, a 16-bit value, must be placed in the low-order word of lpClassName; the high-order word must be zero.

lpWindowName

Points to a null-terminated string that specifies the window name (the window's title). If this parameter is NULL, all window names match.



Return Values

If the function succeeds, the return value is the handle to the window that has the specified class name and window name.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.

See Also

EnumWindows, FindWindowEx, GetClassName, GlobalAddAtom

----------------------
Izwinqwaj za dump-a ama me marzi.... towa e emanaciq na pochti wsichko kazano po-gore. Za tebe ostawa da nauchish klasa na osnowniq si prozorec (syp++) i da ne mu menish chesto chesto tilte-yt..

Отговор
в отговор на FullScream #6

Proverka za running instance vav VB

Vav VB stava lesno

If App.PrevInstance Then
MsgBox "Program already started..."
Else
MsgBox "First instance of this program..."
End If

"App.PrevInstance" vrashta vinagi False za parvata instancia, nezavisimo ot tova, dali sled neia sa startirani drygi. Za tova moje bi niama da ti svarshi rabota v tvoia slychai, no vse pak opitai.

Отговор
в отговор на Гeoprи #7

Abe Mutex-a e naj-siguren!

Spored skromnoto mi mnenie, Mutex-a wse pak e naj-dobroto reshenie. NE samo che toj za podobni zadachi e izmislen (!), ami i ne wsiako prilogenie moge i triabwa da ima prozoretz. Togawa zasto ste ni e da registrirame now wndclass ?

Отговор
в отговор на Winnetou #8

Re: Abe Mutex-a e naj-siguren!

нямах намерение да вземам отношение по тази тема, но...
1. mutex-а изобщо не е измислен за това.
2. както бе посочено кой да е named object върши работа... лично аз предпочитам event.
обикновеният сценарий си е с ERROR_ALREADY_EXISTS..
предимството на event-a е че първата инстанция създава event-a в non-signaled state и може да създаде thread който да wait-ва на event-a.
след това когато се пусне втората инстанция тя може да погледне command line параметрите и ако е примерно нещо от типа на /quit /kill прави SetEvent и финишира. така първата инстанция разбира че има заявка да се quit-не.
елементарна комуникация един вид.
разбира се може да се използва memory mapped file, ако са налице по-сложни комуникативни намерения. :)

Отговор
в отговор на _ #9

Re: Abe Mutex-a e naj-siguren!

Parwo - ako poglednete w rechnika i widite kakwo e mutex, ste wi stane iasno kakwo sam imah predwid- DA MUTEX ne e izmislen za da proweriawa za running instance. Mutex e izmislen za multithreaded programiraneto i za rabotata sas spodeleni resursi. Da ne goworim za roliata mu pri multitasking OS. Imah predwid che mutex e idealniat, i teoretichen, wariant za sluchaia.
Kolkoto do event, toj se zadawa dali da bade wdignat ili ne (ej onzi parameter deto e do manual reset :)) ). Ama towa e edna druga tema .......

Отговор
в отговор на _ #10

Re: Abe Mutex-a e naj-siguren!2

The state of a mutex object is signaled when it is not owned by any thread. The creating thread can use the bInitialOwner flag to request immediate ownership of the mutex. Otherwise, a thread must use one of the wait functions to request ownership. When the mutex's state is signaled, one waiting thread is granted ownership, the mutex's state changes to nonsignaled, and the wait function returns. Only one thread can own a mutex at any given time. The owning thread uses the ReleaseMutex function to release its ownership.
Towa not owned by any thread, moge da wleze w rabota i kogato event-a opre na kamuk!

Отговор
в отговор на FullScream #12

Re: Proverka za running instance - standarten nachin ?

Koito i da e kernel object ste ti svurshi rabota v sluchaia, ako iskash da imasn opredelen broi instances (ne samo 1, no ogranicheni) mojesh da hvurlish edno oko na semaforite :) Izobsto .... vzemi "Advaned Windows" na Jefery Rihter i hvurli edno oko, ima dosta info za tia obekti

Отговор
в отговор на Goose #13

Re: Proverka za running instance - standarten nachin ?

btw Sega mi hrumna che moje da se izpolzwa PostMessage s parametar HWND_BROADCAST i sled towa parwiq instance da sendwa obratno "Tuka sym i bachkam" + HWND za po - natatychna komunikaciq.

Отговор
в отговор на SDR #14

Re: Proverka za running instance - standarten nachin ?

Oniq kak shte iz4aka da mu vurne otgovor ? Koga shte razbere dali da produlji da ba4ka?

Po-princip imashe i nqkakva ideq s suobshtenie, neshto kato tova, no ne se seshtam. Kakvo puk se otvarqm na SDR ?

by Wise Guy
[email protected]
Отговор