Skocz do zawartości

Recommended Posts

Napisano

najprostsze i najszybsze rozwiazanie to zastosowanie zmiennych wspoldzielonych przez rozne instancje tej samej aplikacji

...

// deklarujemy zmienna wspoldzielona
int extra_global __attribute__ ((section ("Shared"), shared)) = 0 ;

...

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance,
LPSTR lpszArgument, int nFunsterStil)
{

if (extra_global == 0)
{
extra_global = extra_global + 1 ;
}
else
return 0 ;

// na koniec zmniejszamy licznik
extra_global-- ;

return messages.wParam;
}

  • 1 month later...
Napisano

Po wnikliwej analizie problemu dotarlem do takiego oto rozwiazania

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  if (hPrevInstance)
        return 0;

Mysle, ze to dosc proste i rozsadne rozwiazanie.

Napisano

W prawdzie nie mialem czasu tego sprawdzic, ale ten piekny zapis znalazlem w zrodlach avp oraz q2. W tym drobim byl pieknie opisany (/* Just in case someone a*** launch me again */). Coz, jezeli nie dziala przyznaje sie do bledu - nie sprawdzilem we wlasnym programie. Jednak przekompilowany Q2 dziala dobrze czyli hPrevInstance nie moze byc rowne 0, poza tym gdy odpalam droga kopie - kicha nic sie nie dzieje.

Napisano

Sprawdzilem i przyznaje sie do bledu (ale dlaczego w Q2 to dziala jak ta lala? - tego nie kumam, bo innego mechanizmu sprawdzajacego nie ma) Coz, z ta porazka na plecach musze isc dalej :) Mutex'y rzadza.

Napisano

Jest jeszcze inny sposob. Mozna zrobic se mutexa. Gdy kopia bedzie chciala uruchomic to po prubie zrobienia muteksa sprawdzic GetLastError() czy jest ruwny ERROR_ALREADY_EXIST jezeli tak to znaczy ze program jest juz uruchomiony. Na koncy programu zwalniamy se mutex i wszystko gra. Jeszcze mozna semaforow uzyc ale nie pamietam tera jak to sie robi. Jak interesuje cie to napisz na meila.

Napisano
3LVI5 napisał:
Jest jeszcze inny sposob. Mozna zrobic se mutexa. Gdy kopia bedzie chciala uruchomic to po prubie zrobienia muteksa sprawdzic GetLastError() czy jest ruwny ERROR_ALREADY_EXIST jezeli tak to znaczy ze program jest juz uruchomiony. Na koncy programu zwalniamy se mutex i wszystko gra. Jeszcze mozna semaforow uzyc ale nie pamietam tera jak to sie robi. Jak interesuje cie to napisz na meila.

hmmm... niewiem po co piszesz o mutexach skoro to juz zostalo poruszone w tym temacie :/

Napisano

Hmm.... Sluszna uwaga, tyle, ze gdzies to juz chyba czytalem. A juz pamietam. Patrz wyzej! Nie, jeszcze wyzej! - Sorry, za ironie, ale to bylo przegiecie - tyczy sie mutex'ow. P.S. Witamy nowego czlonka na forum.

Napisano
3LVI5 napisał:
jakos nie doczytalem, kazdemu sie zdarza co nie ???

Jasne ze moze sie zdarzyc jesli jest do przeczytania minimum z 3 strony. A tu wystarczylo przeczytac jedna i juz bylo widac ze ktos o tym juz napisal. Jakby bylo wiecej stron do czytania to bym ani slowa nie napisal no ale jak nawet DRACULA zauwazyl to juz kilka arzy sie powtarzalo.

ps
jestem jakis niegoscinny
witam new user ;)

  • 3 months later...
Napisano

Miejscem na utworzenie semafora jest plik główny projektu, czyli ten, gdzie znajduje się funkcja WinMain().

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) 
{ 
   HANDLE hSemaphore = CreateSemaphore(NULL,    //atrybuty ochrony czy coś 
                                         1,    //poczatkowy stan licznika 
                                         5,    //max stan licznika 
                                         "MOJ.SEMAPHORE" //nazwa semafora 
                                        ); 

Próbuje stworzyć semafor, jeżeli już jest system zwróci poprzedni, bez tworzenia nowego, wtedy olewa parametry licznika.
Wartość semafora zostanie zmniejszona przy każdym wywołaniu WaitForSingeObject();
Kiedy WaitForSingleObject() zwróci WAIT_OBJECT_0, oznacza to, że wartość semafora wyzerowała się.

   if(hSemaphore && WaitForSingleObject(hSemaphore, 0)!= WAIT_OBJECT_0){ 
      CloseHandle(hSemaphore); 
      ShowMessage("Aplikacja jest już odpalona na maxa!"); 
      return 0; 
   } 

Na końcu funkcji WinMain() zwalniamy semafor co ziwekasza jego wartość

ReleaseSemaphore(hSemaphore,1,NULL); 
CloseHandle(hSemaphore); 

to tyle. w najprostrzej wersji hhehee. Jak zadziala to extra. Jak nie to lipa ehheeehe.

A tu troche lepiej o synchro: https://www.ii.uni.wroc.pl/~wzychla/ra2223/so2.html

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...