[ Dr.Aculla @ 26.05.2006. 23:33 ] @
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)?
[ X Files @ 27.05.2006. 07:52 ] @
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
[ leka @ 29.05.2006. 08:59 ] @
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
[ blaza @ 29.05.2006. 17:52 ] @
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)){
    //...
}

[ Dr.Aculla @ 30.05.2006. 10:50 ] @
Hvala svima!
[ mipko @ 31.05.2006. 09:23 ] @
a mozes i sa named mutex-om. Prva instanca kreira mutex a sledecim instancama ce prilikom kreiranja getlasterror da vrati ERROR_ALREADY_EXISTS.
[ cynique @ 31.05.2006. 10:49 ] @
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.