Duckling Napisano Sierpień 25, 2018 Autor Zgłoś Udostępnij Napisano Sierpień 25, 2018 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; } Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Omega Napisano Sierpień 25, 2018 Zgłoś Udostępnij Napisano Sierpień 25, 2018 Wydaje mi sie, ze createmutex nie jest wcale trudne. Jest wlasnie tez szybkie i proste. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Gucio Napisano Wrzesień 30, 2018 Zgłoś Udostępnij Napisano Wrzesień 30, 2018 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. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Nemo Napisano Wrzesień 30, 2018 Zgłoś Udostępnij Napisano Wrzesień 30, 2018 Chyba słabo czytałes Petzolda. hPrevInstance w wersjach 32bitowych windowsa zawsze ma wartość 0 :D To coś zadziałą tylko na wersjach 16bitowych;) Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Gucio Napisano Wrzesień 30, 2018 Zgłoś Udostępnij Napisano Wrzesień 30, 2018 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. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Omega Napisano Wrzesień 30, 2018 Zgłoś Udostępnij Napisano Wrzesień 30, 2018 Piasiu ma racje, hPrevInstance mogl byc tylko wykorzystany w win 3.1X. bo od win 95 to dupa. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Gucio Napisano Wrzesień 30, 2018 Zgłoś Udostępnij Napisano Wrzesień 30, 2018 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. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Doc Napisano Październik 3, 2018 Zgłoś Udostępnij Napisano Październik 3, 2018 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. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Nemo Napisano Październik 3, 2018 Zgłoś Udostępnij Napisano Październik 3, 2018 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 Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Doc Napisano Październik 3, 2018 Zgłoś Udostępnij Napisano Październik 3, 2018 jakos nie doczytalem, kazdemu sie zdarza co nie ??? Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Gucio Napisano Październik 3, 2018 Zgłoś Udostępnij Napisano Październik 3, 2018 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. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Nemo Napisano Październik 3, 2018 Zgłoś Udostępnij Napisano Październik 3, 2018 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 ;) Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Doc Napisano Październik 4, 2018 Zgłoś Udostępnij Napisano Październik 4, 2018 Dzieki za przywitanie a co do mojej pomylki to juz schylilem glowe i uznalem swojom wine :P Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Panther Napisano Styczeń 28, 2019 Zgłoś Udostępnij Napisano Styczeń 28, 2019 Tak dla draki napisze ze jest jeszcze numer z SEMAPHERE'ami. To jak mutexy tylko mozna kontrolować i synchronizować zadaną ilość procesów. Tak tylko pisze sobie :P . Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Nemo Napisano Styczeń 28, 2019 Zgłoś Udostępnij Napisano Styczeń 28, 2019 BiZoNX: to napisz cos wiecej o tym ;) Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Panther Napisano Styczeń 30, 2019 Zgłoś Udostępnij Napisano Styczeń 30, 2019 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 Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Nemo Napisano Styczeń 31, 2019 Zgłoś Udostępnij Napisano Styczeń 31, 2019 No to prawei to samo co mutexy ;) Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.