Skocz do zawartości

taki sam


Duckling

Recommended Posts

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;
}

Link do komentarza
Udostępnij na innych stronach

  • 1 month later...

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.

Link do komentarza
Udostępnij na innych stronach

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.

Link do komentarza
Udostępnij na innych stronach

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 :/

Link do komentarza
Udostępnij na innych stronach

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 ;)

Link do komentarza
Udostępnij na innych stronach

  • 3 months later...

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

Link do komentarza
Udostępnij na innych stronach

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...