• 6 odgovora
  • 6.067 pregleda
Kako spreciti dvostruko startovanje MFC programa? 26.05.2006. u 23:33 · pre 248 meseci #1
Napisao sam programce koje se po startovanju i minimiziranju glavnog prozora smesta u systray! Kako spreciti da se klikom na ikonu programa na desktopu program dvostruko startuje (Npr/ neko ne vidi ikonicu u systray-u i klikne na glavnu ikonu kojom se program startuje)?
Re: Kako spreciti dvostruko startovanje MFC programa? 27.05.2006. u 07:52 · pre 248 meseci #2
To ze kaze, kako dozvoliti samo 'jednu instancu' ('one instance', 'single instance') programa.
Stvar se obicno resava tzv Mutex-ima, a primera na netu mozes naci koliko god hoces, npr:

http://www.codeguru.com/forum/showthread.php?t=312467
http://www.codersource.net/mfc_single_instance.html
Re: Kako spreciti dvostruko startovanje MFC programa? 29.05.2006. u 08:59 · pre 248 meseci #3
Ima vise mogucih alternativa. Evo nekih:
1) Mozes koristiti read-write lock. Prva instanca aplikacije zakljuca fajl, recimo C:/tmp/myapp.lock (napravi fajl ako ne postoji), kada se startuje druga instanca, onda ona pokusa da lokuje fajl, ako ne uspe ugasi se.
2) Slicna prica kao u prethodnom. U Registry napravis kljuc HKEY_CURRENT_USER/Software/MyApp/lock i setujes mu vrednost tako sto uzmes PID od programa. Druga instanca otvori Registry, pogleda tu vrednost i uporedi sa svojim PID-om, ako nije isti, gasi se. Ne treba napominjati da je odgovornost prve aplikacije da obrise lock vrednost prilikom gasenja, inace se program vise nikada nece startovati. :D
Potpis
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
Re: Kako spreciti dvostruko startovanje MFC programa? 29.05.2006. u 17:52 · pre 248 meseci #4
Jos jedna mogucnost (Win32): glavnom prozoru svog progama dodelis unikatno ime klase, npr "_#@$$DR_ACCULLA_SYSTRAY_MASTER_V10$$@#_", a zatim koristis proveru:
Code:

#define CLASS_NAME "_#@$$DR_ACCULLA_SYSTRAY_MASTER_V10$$@#_"
//...
if(FindWindow(CLASS_NAME, NULL)){
    //...
}

Potpis
O_o
Re: Kako spreciti dvostruko startovanje MFC programa? 31.05.2006. u 10:49 · pre 248 meseci #7
Citat:
leka: Ima vise mogucih alternativa. Evo nekih:
1) Mozes koristiti read-write lock. Prva instanca aplikacije zakljuca fajl, recimo C:/tmp/myapp.lock (napravi fajl ako ne postoji), kada se startuje druga instanca, onda ona pokusa da lokuje fajl, ako ne uspe ugasi se.


RWlock kao kernelov sinkronizacijski primitiv dolazi tek u Visti, premda ga nije previše teško ručno izgraditi nad tradicionalnim win32 API-jem. Na Win32 bi analog bio uzajamno isključiv pristup nekom praznom dummy fajlu u temp direktoriju čiji bi pristup bio sinkroniziran sa LockFile().

Citat:
2) Slicna prica kao u prethodnom. U Registry napravis kljuc HKEY_CURRENT_USER/Software/MyApp/lock i setujes mu vrednost tako sto uzmes PID od programa. Druga instanca otvori Registry, pogleda tu vrednost i uporedi sa svojim PID-om, ako nije isti, gasi se. Ne treba napominjati da je odgovornost prve aplikacije da obrise lock vrednost prilikom gasenja, inace se program vise nikada nece startovati. :D


Zato i jest bolje koristiti kernel objekte koje imaju koncept vlasništva (ownership), poput mutexa. U slučaju terminiranja niti koja ga je stvorila (npr. glavne niti procesa koja izlazi kad i proces sam), WFSO() će vratiti WAIT_ABANDONED i novi proces će automatski preuzeti vlasništvo. Ime mutexa je najbolje generirati prilikom instalacije kao GUID.
Potpis
Put the funk in funktion.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme