Cześć!
Mam prośbę do bardziej obeznanych w temacie: czy mógłby mi ktoś wyjaśnić łopatologicznie o co chodzi z tzw. "named pipes"? Chcę pisać w jednym języku (C++) i jednocześnie korzystać z aplikacji napisanej w innym języku. Przeczytałem, że jednym z rozwiązań jest właśnie użycie named pipes, ale nigdzie nie mogę znaleźć jakiegoś wartościowego artykułu o tym mechanizmie w języku polskim. Czy mógłby mi ktoś pomóc i wyjaśnić w skrócie lub odesłać do jakiegoś wyczerpującego tekstu?
Z góry dziękuję za pomoc!
Chcę pisać w jednym języku (C++) i jednocześnie korzystać z aplikacji napisanej w innym języku.
Zanim się rzucisz na named pipes które są trochę upierdliwe, wyjaśnij może na czym ma polegać to „jednoczesne korzystanie”.
Bo może będzie lepsze rozwiązanie, np. zwykłe wywołanie DLL-ki.
A więc tak: od dłuższego czasu bawię się w pisanie różnych systemów transakcyjnych na rynku finansowym forex w języku MQL4 (język podobny do C). Język ten jest wbudowany w platformę MetaTrader (MT) i jest bardzo ubogi i często kłopotliwy, dlatego też postanowiłem tworzyć systemy w bardziej zaawansowanych środowisku i języku, którym jest MV C++.
Ogólna koncepcja jest taka, by napisać jakąś prostą aplikację w MQL, która będzie przesyłać potrzebne mi dane z platformy MT do innej aplikacji napisanej w C++ a która będzie wykonywać na niej jakieś opearcje i zwracać wynik z powrotem do MT przez MQL.
Chodzi tu o dwojaki dostęp do danych:
- By mieć dostęp do danych, do których mam dostęp z poziomu MQL (czyli tego wbudowanego języka) - łącznie lub przede wszystkim z danymi historycznymi.
- By ściągać na bieżąco nowe dane (cena instrumentów zmienia się co kilka sekund/minut i chciałbym, by mój program w C++ je na bieżąco otrzymywał).
Potoki nazwane są opisane na necie, nie ma sensu kopiować tutaj treści czy wyników wyszukiwania z Google.
W skrócie, jeśli jesteś na jakimś Uniksie/ Linuksie/ czymkolwiek zgodnym z POSIX to:
- utwórz potok nazwany za pomocą programu mkfifo - potok nazwany będzie widoczny praktycznie jak zwykły plik,
- niech jeden program otworzy ten potok do zapisu, a drugi do odczytu,
- od teraz ten czytający powinien oczekiwać na dane od tego zapisującego i je sczytywać,
- żeby mieć komunikację także w drugą stronę, musisz stworzyć dwa potoki nazwane,
Wibowit napisał(a):
Potoki nazwane są opisane na necie, nie ma sensu kopiować tutaj treści czy wyników wyszukiwania z Google.
Właśnie problem jest taki, że po wpisaniu hasła named pipe w google jakoś nic wartościowego mi nie znalazło :(
Wibowit napisał(a):
W skrócie, jeśli jesteś na jakimś Uniksie/ Linuksie/ czymkolwiek zgodnym z POSIX to:
A jak ma się do tego Windows XP i/lub windows 7? :) - nie znam się na tym :(
Z góry wielkie dziękuję za pomoc! :)
Potoki nazwane w Windowsie są chyba zupełnie niekompatybilne z tymi POSIXowymi. Na jakim systemie chodzi ta platforma MetaTrader?
Platforma MetaTrader jest zainstalowana lokalnie - na tym samym komputerze co ma działać aplikacja w C++ - czyli w windowsie.
Za pomocą tej platformy użytkownik łączy się z brokerem (firmą, która jest tak jakby pośrednikiem :)) - tj. pobiera i wysyła dane do serwera brokera.
W WinAPI jest funkcja CreateNamedPipe. Zapewne dostarcza funkcjonalności której potrzebujesz - o ile oczywiście w tym języku MQL możesz korzystać z WinAPI.
Chłopaki! Wybaczcie, że się wcześniej nie wysiliłem i nie podałem z jakiego systemu operacyjnego korzystam - nie byłem świadom, że jest to informacja istotna a poza tym zbyt duża ilość treści zniechęca was, bardziej doświadczone osoby, do jej czytania :).
Dlatego prosiłbym już zostawić ten aspekt problemu :P a skoncentrować się na kontynuacji merytorycznych kwestii :)
Czy w związku z powyższym może mi ktoś wyjaśnić co oznacza, że "Potoki nazwane w Windowsie są chyba zupełnie niekompatybilne z tymi POSIXowymi"? Czego mogę się w takiej sytuacji obawiać? Jakie niebezpieczeństwa są z tym związane?
Czy jeśli platforma jest zainstalowana lokalnie - na tym samej maszynie (komputerze) co ta druga aplikacja i działają na tym samym systemie operacyjnym to czy będzie to miało jakieś znaczenie?
Czy może lepiej szukać innego rozwiązania na komunikację między aplikacjami? - jeśli tak to co byście zaproponowali?
Z góry dziękuję i pozdrawiam!
A czy ten język do metatradera w ogóle obsluguje potoki? Albo sockety?
Dziękuję Ci za aktywność Wibowit!
Tak, w MQL chyba można korzystać z WinApi.
Zaraz przestudiuję co to za funkcja :).
pozdrawiam!
@Shalom, w MQL można importować sobie dll-ki
No to jak możesz korzystać z DLL-ki to nie musisz używać potoków, tylko możesz użyć np callbacki, wątki, itp
WinApi dopiero się uczę - dlatego pytam was :)
A możesz tak w skrócie napisać czym się charakteryzują poszczególne rozwiązania - jaką mają przewagę na potokami i między sobą?
Będę ogromnie wdzięczny!
Widzę, że niestety temat umarł :(
Czy może mi ktoś chociaż podpowiedzieć czy jeśli platforma jest na tym samym komputerze co inna aplikacja i używany jest system Windows to czy wówczas ma jakieś znaczenie, że "Potoki nazwane w Windowsie są chyba zupełnie niekompatybilne z tymi POSIXowymi"?
Czy może ten fakt będzie miał jedynie znaczenie, gdy będą dwa różne systemy operacyjne?
z góry dziękuję za pomoc!
Jeśli po obydwu stronach masz WinAPI, albo po obydwu stronach masz POSIXa to nie ma problemu. No ale skoro możesz ładować DLL-ki to ich ładowanie byłoby raczej najwygodniejsze i najwydajniejsze.
Wibowit napisał(a):
Jeśli po obydwu stronach masz WinAPI, albo po obydwu stronach masz POSIXa to nie ma problemu. No ale skoro możesz ładować DLL-ki to ich ładowanie byłoby raczej najwygodniejsze i najwydajniejsze.
Ale chodzi Ci, by zamiast w całości przejść na C++ i łączyć się z inną aplikacją, która łączy się z platformą to pisać tylko w C++ dll-ki i ładować je do MQL-a i tam używać, czy chodzi Ci o wykorzystanie jakiejś konkretnej dll-ki do komunikowania się między programami?
Chodzi mi o wpakowanie logiki do DLL-ki i podłączenie jej do tego MetaTradera, czyli to pierwsze.
Ok! Dziękuję Ci bardzo za pomoc!
pozdrawiam!