Mutex

dział ogólny

Mutex

Nowy postprzez oneiro » wtorek, 5 lutego 2013, 00:42

Witam,

Pociągnę temat z innego forum, tam chyba skończyły się pomysły...

Problem jest prosty - do działania programu potrzebne są pewne biblioteki dll. Aby program mógł zadziałać ścieżki do tych bibliotek muszą być w zmiennej środowiskowej "PATH". Wszystko ładnie dopóki program działa u mnie. U kogoś innego ścieżki są gdzie indzie (biblioteki są w innej lokalizacji i trzeba ręcznie je dodawać). Aby oszczędzić roboty innym narzuciłem ją sobie, czyli dopisanie do zmiennej "PATH" na czas trwania programu kilku/-nastu domyślnych ścieżek z prawdopodobnymi lokalizacjami bibliotek.

Avy ścieżka zadziałała muszę wywołać program startujący (tzw. launcher), który dodaje ścieżki i uruchomi właściwy program. I to mi działa.

Ale chciałem zrobić lepiej, czyli wszytko w jednym pliku wykonywalnym (bez launchera) i tutaj podobno z pomocą przychodzi tzw. mutex. Koledzy z innego forum podali mi rozwiązanie, ale nie działa to jak powinno (tj program uruchamia się 2x razy, a nie raz, w dodatku bez działających nowych ścieżek).

Aby nie mieszać między wątkami - czy ktoś potrafi mi powiedzieć, jak za pomocą mutexu w jednej aplikacji
a) dodać ścieżki do zmiennej "PATH"
b) uruchomić siebie (tj program) z nowymi ścieżkami (tutaj podobno cały myk z mutexem, ale go nie ogarniam)
c) poprawnie działać i się zamknąć na końcu bez błędów
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: Mutex

Nowy postprzez Cyfrowy Baron » wtorek, 5 lutego 2013, 10:43

Mutex nie rozwiąże ci problemu ze zmienną środowiskową. Zmienna środowiskowa jest po to by program znalazł potrzebne pliki, czyli program rozpoczyna poszukiwanie potrzebnych do funkcjonowania plików przeglądając lokalizacje określone w zmiennych środowiskowych. Jeżeli dodasz taką nową zmienną to program również będzie w niej szukał. Najprostszym rozwiązaniem jest wrzucenie takich bibliotek do katalogu programu, lub do katalogu systemowego Windows gdyż program zawsze tam szuka.
Jeżeli nie możesz tego zrobić, to mutex'y nie pomogą gdyż musisz wskazać programowi gdzie ma szukać tych bibliotek. Gdybyś podał coś więcej na temat tych bibliotek to może dałoby się coś z tym zrobić, a tak to błądzimy w ciemności... :roll:

oneiro napisał(a):b) uruchomić siebie (tj program) z nowymi ścieżkami (tutaj podobno cały myk z mutexem, ale go nie ogarniam)


Mutex może zapobiec uruchomieniu kopii aplikacji. Niech program uruchomi własną kopię a potem zakończy działanie. Mutex nie jest do tego potrzebny.

oneiro napisał(a):c) poprawnie działać i się zamknąć na końcu bez błędów


To już chyba nie zależy od programu lecz programisty... :)

oneiro napisał(a):a) dodać ścieżki do zmiennej "PATH"


Przecież już to zrobiłeś:

oneiro napisał(a):muszę wywołać program startujący (tzw. launcher), który dodaje ścieżki i uruchomi właściwy program.


Cały problem sprowadza się do tego, że program nie wie gdzie szukać tych bibliotek. Jeżeli biblioteki są zarejestrowane to lokalizację można znaleźć w rejestrze i to chyba w kluczu: HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\KnownDLLs - ale nie jestem tego pewien.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Mutex

Nowy postprzez polymorphism » wtorek, 5 lutego 2013, 11:11

Pociągnę temat z innego forum, tam chyba skończyły się pomysły...

Mowa o wątku z "Mojej Pasji", i z tego co zauważyłem, to Tobie raczej skończyły się pomysły. Dostałeś rozwiązanie, które powinieneś przystosować do swojego projektu. Zrobiłeś to z błędami - źle lepiłeś ścieżki. I w sumie nie wiadomo, czy poprawiłeś błąd, a jeśli tak, czy dało to jakieś rezultaty.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Mutex

Nowy postprzez oneiro » wtorek, 5 lutego 2013, 12:55

@ polymorphism
Tak, wątek z mojej pasji:

http://forum.programuj.com/viewtopic.php?p=60237#60237

Ale zlepienie ścieżek nie było problemem (na testy miałem ich cztery i pierwsza była rzeczywiście źle zlepienia, ale na testowanych komputerach wykorzystywałem albo 3-cią albo 4-tą ścieżkę, także to było bez znaczenia). Po poprawce nic się nie zmieniło (no poza pierwszą ścieżką, która zaczęła działać).
Rozwiązanie dostałem, ale i tak nie działa :)

@Cyfrowy Baron jak masz chwilkę zerknij proszę na na ten wątek, a konkretnie ostatnich kilka postów
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: Mutex

Nowy postprzez polymorphism » wtorek, 5 lutego 2013, 13:04

U mnie kod testowy, zlepiony z tego co dostałeś, działa bez problemu, tzn. ustawia ścieżkę i odpala proces potomny, po czym sam się zamyka. Testowane na WinXP.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Mutex

Nowy postprzez Cyfrowy Baron » wtorek, 5 lutego 2013, 13:07

Z tego co widzę to zmienna środowiskowa ustawiane przez program nie nadaje się do tego celu. Co innego gdyby podczas instalacji to Matlab dodawał ścieżkę do zmiennych środowiskowych.

Widzę to tak:

1. Umieść potrzebne biblioteki w katalogu programu - program zawsze je znajdzie - nie wiem czy to przejdzie.
2. Wprowadź w programie funkcję, która przy pierwszym uruchomieniu programu, lub gdy nie odnajdzie biblioteki zażąda od użytkownika wskazania katalogu z Matlab. Program potem podłączy się do bibliotek we wskazanej lokalizacji lub utworzy w systemie zmienną systemową.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Mutex

Nowy postprzez Darek_C++ » wtorek, 5 lutego 2013, 14:23

Z tego co wiem najpierw przeszukiwany jest katalog z programem, potem dalsze ze standardowych lokalizacji DLL.
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Mutex

Nowy postprzez oneiro » wtorek, 5 lutego 2013, 14:37

@Cyfrowy Baron tylko, że jeśli zrobię launchera (tj uruchomię proces, ustawię w nim ścieżki i wywołam właściwy proces) to działa wyśmienicie, więc wydaje mi się, że metoda jest dobra. A o przenoszeniu bibliotek do katalogu - hmm...po pierwsze nie wiem czy zadziała, a nawet jeśli to biblioteki ważą grubo ponad ~625 MB, nie praktyczne rozwiązanie.
Pomysł o wskazanie ścieżek - dobry, ale i tak będzie musiał operator zrobić to ręcznie, a program ma być jak najmniej uciążliwy (ma być uruchomiony na komputerach w domenie Windows i podobno mają zblokowane dodawanie ścieżek z ręki, tj prawo-klik na mój komputer, ale jak jest na prawdę, nie wiem, więc wolę się zabezpieczyć w ten sposób, aby nie było wtopy).

@ polymorphism
Też mam WinXp SP3, ale u mnie nie działa :/

Usuwam wszystkie ścieżki do bibliotek Matlaba w zmiennej PATH. Uruchamiam lauchera - idzie. Uruchamiam z mutex'em - nie idzie, krzyczy o braku bibliotek. Coś jeszcze musi być, że nie mi nie działa. Skompiluje się, ale uruchomić się nie chce, ani w debugerze ani w explorerze.

@Darek_c++ zgadza się, ale skopiowanie bibliotek do programu nie jest praktycznym rozwiązaniem (próbowałem kopiować bibliotekę po bibliotece, po kilkunastu dałem sobie spokój, przy skopiowaniu całości idzie, ale za dużo miejsca się traci).
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: Mutex

Nowy postprzez oneiro » wtorek, 5 lutego 2013, 14:52

polymorphism napisał(a):U mnie kod testowy, zlepiony z tego co dostałeś, działa bez problemu, tzn. ustawia ścieżkę i odpala proces potomny, po czym sam się zamyka. Testowane na WinXP.


Mam jeszcze pytanie - dodajesz ścieżkę, która nie istnieje w zmiennej PATH, czy też usunąłeś jakaś i zrobiłeś testa?
O co mi chodzi - jeśli masz w explorerze "uruchamiaj okna w osobnych procesach" to po zabiegu modyfikacji zmiennej PATH okno "pamięta" stare ścieżki, także trzeba je uruchomić jeszcze raz.
To samo z builderem (jeśli z niego korzystasz, ale to tyczy się chyba każdego programu uruchomionego w czasie modyfikacji ścieżek), należy uruchomić jeszcze raz buildera po modyfikacji.

No chyba, że dopisałeś zupełnie nowe ścieżki, więc wówczas masz pewność, że program zadziałał dobrze - czy właśnie tak Ci działa? Jeśli tak mogę prosić o przykładowy kod, może tak dojdę co robię nie tak.
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: Mutex

Nowy postprzez polymorphism » wtorek, 5 lutego 2013, 15:11

Usuwam wszystkie ścieżki do bibliotek Matlaba w zmiennej PATH. Uruchamiam lauchera - idzie. Uruchamiam z mutex'em - nie idzie, krzyczy o braku bibliotek.

Ech, dzisiaj nie trybie za bardzo. No jasne, że to w ten sposób nie zadziała - przecież sam laucher wymaga bibliotek :D Ta opcja zadziała przy ładowaniu dynamicznym poprzez LoadLibrary. Choć z drugiej strony możesz spróbować użyć opcji opóźnienia ładowania DLL-ek. Nie jestem w stanie teraz tego sprawdzić, bo mam zainstalowane jedynie MinGW, które nie ma takiej opcji.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Mutex

Nowy postprzez oneiro » wtorek, 5 lutego 2013, 16:08

polymorphism napisał(a):Choć z drugiej strony możesz spróbować użyć opcji opóźnienia ładowania DLL-ek.


Działa :D

Dodałem dwie biblioteki z opóźnionym startem libeng.dll oraz linmx.dll, które następnie przy ich załadowaniu ladują całą masę innych bibliotek.

Ogólnie trochę to zakręcone ale działa to tak:
- za pomocą implib tworzę pliki LIB (z dwóch oryginalnych bibliotek - libeng.dll oraz libmx.dll z katalgu Matlaba) które następnie dołączam do projektu
- ustawiam opóźnienie ładowanie DLL'ów (libeng.dll oraz libmx.dll)
- korzystam z mutexa, który tworzy mi CreateProcess (trochę zmodyfikowany wywołanie tej funkcji - teraz argumentem jest GetModuleFileNameA czyli uruchamiam siebie samego).

Co prawda jest "przeskok" między oknami (jedno się otwiera, później drugie, a pierwsze się zamyka), ale tak poza tym śmiga :D

Super, wszystko w jednym pliku, dzięki za pomoc
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: Mutex

Nowy postprzez polymorphism » wtorek, 5 lutego 2013, 19:15

A skąd ten "przeskok", jeśli w pierwszym etapie nie dochodzi do tworzenia jakiegokolwiek okna?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Mutex

Nowy postprzez oneiro » wtorek, 5 lutego 2013, 20:26

masz rację :) uruchamiałem to z poziom kompilatora (zwie się to chyba RAD?) i mignięcie to jest okno kompilatora, tj uruchamia się proces poprzez F9, który wywołuje inny proces (czyli siebie samego) i pierwszy proces się "zabija". Po zakończeniu pierwszego programu kompilator przełącza się na pierwszy plan, a 2-gi proces (czyli de faco mój program) jest w tle.
Szybkie mignięcie jest przełączne z mojego programu do środowiska kompilatora, wg mnie jest OK, tylko wcześniej źle to zinterpretowałem.

Wywołując z poziomu explorera wygląda dobrze.
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: Mutex

Nowy postprzez polymorphism » wtorek, 5 lutego 2013, 22:39

zwie się to chyba RAD?

Zwie to się IDE (Integrated Development Environment), RAD (Rapid Aplication Development) to sposób tworzenia aplikacji.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Mutex

Nowy postprzez Cyfrowy Baron » środa, 6 lutego 2013, 00:11

Jak rozumiem w zmiennej środowiskowej PATH zapisujesz kilka możliwych lokalizacji tych bibliotek? A co jeśli się okaże, że zmienna nie zawiera prawidłowej lokalizacji?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 38 gości