Komunikacja między dwoma aplikacjami na tym samym komputerze

Komunikacja między dwoma aplikacjami na tym samym komputerze
robertz68
  • Rejestracja:około 18 lat
  • Ostatnio:5 dni
  • Lokalizacja:Zielona Góra
0

Cześć,

słuchajcie, jak przekazać trochę danych (jednego stringa) między dwoma aplikacjami na tym samym komputerze? Obydwie aplikacje będą mojego "pióra" więc rozchodzi mi tylko o to jakiej technologii użyć?
Dane powinny być przekazywane w miarę online, system powinien być odporny na błędy związane z brakiem aplikacji docelowej.
Myślałem o komunikatach, socketach tcp czy lepiej UDP, plikach tekstowych (to najmniej mi się podoba).
Powinno to być lekkie, bo w końcu to prosta sprawa (niby).
Coś zasugerujecie?

cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Poznań
  • Postów:8753
8

Czy zawsze będą na tym samym kompie, czy jest później opcja rozdzielenia?
Czy będzie to zawsze 1:1 czy np. jest opcja jednego serwera i kilku klientów?
Jak długie będą te komunikaty?
Czy potrzebujesz potwierdzeń otrzymania/nic nie może się zgubić, czy jak jakiś komunikat przepadnie to nic się nie stanie?


KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:około godziny
  • Lokalizacja:Silesia/Marki
  • Postów:5505
5
cerrato napisał(a):

Czy zawsze będą na tym samym kompie, czy jest później opcja rozdzielenia?
Czy będzie to zawsze 1:1 czy np. jest opcja jednego serwera i kilku klientów?
Jak długie będą te komunikaty?
Czy potrzebujesz potwierdzeń otrzymania/nic nie może się zgubić, czy jak jakiś komunikat przepadnie to nic się nie stanie?

Brakło jeszcze pytania jaki system, bo jak linux/unix to mozna użyć Unix domain socket.
Z tak niewielnik opisam, to jakbym miał zaklepać na szybko komunikacje to użyłbym RESTa bo to znam najlepiej :P
Jakbym miał wiecej czasu to poczytałbym o ZeroMQ bo już dawno chciałem to przetestować. Chyba nawet jest jakiś binding dla pascala


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
Zobacz pozostałe 5 komentarzy
KamilAdam
To tak jak Java. Nigdy nie pomyślałem o tym, że nie muszę uzywać Delphi, bo Java jest wieloplatformowa
stivens
@KamilAdam: a najlepiej na Kotlina
KamilAdam
@stivens: nie rozumiem :( (coś często to ostatnio powtarzam :D )
KamilAdam
A to tak :D jak najbardziej. Najlepiej to na Scalę oczywiście :P
DZ
  • Rejestracja:ponad 13 lat
  • Ostatnio:27 dni
  • Lokalizacja:Podaj nazwę miejscowości
3

Jeśli Windows - ja do tego używam komunikacji opartej na bazie WM_COPYDATA. Prościej się chyba nie da.

cerrato
Dokładnie - chciałem to zasugerować, stąd moje pytanie czy na pewno będzie to zawsze na tej samej maszynie.
SL
  • Rejestracja:około 7 lat
  • Ostatnio:4 minuty
  • Postów:857
3

Jak komunikacja request response to HTTP. Jak komunikaty i trzymanie połączenia to websockety. Jak chcesz oba na raz i lubisz protobufy to gRPC. Tak czy owak: normalne rozwiązania, których używamy pomiędzy aplikacjami na różnych maszynach. Inne rozwiązania mają sens jak te trzy niedomagają wydajnościowo.

edytowany 1x, ostatnio: slsy
Miang
stawiać całego Apache do wysłania jednego stringa?
SL
jaki apache? HTTP to utworzenie socketu tcp i wysłanie przez niego stringa. Po co apache?
KA
  • Rejestracja:ponad 19 lat
  • Ostatnio:minuta
  • Lokalizacja:Gorlice
3

Jak Windows to moze stary dobry (bo wypróbowany) sposób https://docs.microsoft.com/en-us/windows/win32/memory/creating-named-shared-memory (w C++ ale nie ma żadnego problemu aby to zrobić w Delphi)
Oczywiście można użyć socketów (TCP/IP lub UDP nie żadne HTTP jak ktoś proponował) ale może wystąpić problem zajętych portów itp.
WM_COPYDATA - wymaga znalezienia uchwytu okna aplikacji co nie zawsze jest proste (np. FreePacal w odróżnieniu od Delphi zdaje sie nie bardzo pozwala na zmianę klasy okna).


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: kAzek
Zobacz pozostałe 3 komentarze
KA
Jak po co? Jak chcesz się napić piwa to od razu kupujesz browar? Do takiej pierdoły HTTP... masakra. Temat jest w Delphi jak nie zauważyłeś to po co wsparcie innych języków? Taką komunikację robi się w kilkanaście minut prosty przykład można znaleźć nawet na tym forum INDY
SL
po co wsparcie innych języków?: po co wybierać technologię wspierającą ograniczoną liczbę języków jak mogę wybrać tą, która wspiera wszystko. Dobre wsparcie to też np. lepsze debugowanie: jak jedna aplikacja zacznie się dziwnie zachowywać to strzelę z palca curla i zobaczę co tam się dzieje. Nie wiem jak to wygląda w indy
KA
Po co w ogóle są inne języki lepiej ustanowić JEDEN JEDYNY SŁUSZNY reszta do lamusa (no i oczywiście nawet nie próbować tworzyć nowych, bo te dzisiaj jedyne słuszne mogły by zostać wyparte. CURLa ale też po co jak jest Postman to sobie możesz strzelać w HTTP (i inne zdefiniowane protokoły ale o tym nie mówimy) i to dotyczy aplikacji w KAŻDYM JĘZYKU nie ma to żadnego znaczenia.
SL
Nie rozumiem twojego pytania, to ty pytałeś po co wsparcie innych języków xd Ja uważam, że jak można wspierać wszystko to czemu nie, kto wie, czy w przyszłości nie będzie potrzeby przepisania jednej aplikacji na coś innego
KA
No właśnie... ale to tyczy się każdego języka nawet tych obecnie na topie. Przypominam Delphi jak i FreePascal to także nadal rozwijane języki więc nie ma co tu się martwić o przyszłość. Poza tym akurat ten przypadek raczej nie dotyczy aplikacji która ma być nie przez jaki czas rozwijana i wspierana.
DZ
  • Rejestracja:ponad 13 lat
  • Ostatnio:27 dni
  • Lokalizacja:Podaj nazwę miejscowości
1

WM_COPYDATA - wymaga znalezienia uchwytu okna aplikacji co nie zawsze jest proste (np. FreePacal w odróżnieniu od Delphi zdaje sie nie bardzo pozwala na zmianę klasy okna).

A czasem aplikacja nie ma okna dlatego warto sobie napisać prostą bibliotekę/komponent tworzący niewidoczne okno najlepiej nietypowej klasy (RegisterClass). To pozwala na połączenie nawet między aplikacjami konsolowymi.
Użycie socketów ma tą wadę że czasem burzą się firewalle. No i systemowy komunikat w zasadzie wymusza drugą aplikację działającą na tym samym systemie. Ma to tak samo wady jak i zalety, zależnie od potrzeb.

cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Poznań
  • Postów:8753
3

FreePacal w odróżnieniu od Delphi zdaje sie nie bardzo pozwala na zmianę klasy okna

Ale po co masz zmieniać klasę, żeby dogrzebać się do uchwytu okna?


KA
  • Rejestracja:ponad 19 lat
  • Ostatnio:minuta
  • Lokalizacja:Gorlice
1
cerrato napisał(a):

FreePacal w odróżnieniu od Delphi zdaje sie nie bardzo pozwala na zmianę klasy okna

Ale po co masz zmieniać klasę, żeby dogrzebać się do uchwytu okna?

Aby mieć jakąś unikalną a nie standardowy TForm co pozwoli w bardziej pewny sposób znaleźć i pobrać uchwyt okna.


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
robertz68
  • Rejestracja:około 18 lat
  • Ostatnio:5 dni
  • Lokalizacja:Zielona Góra
0

Precyzując:

  • aplikacja główna to POS,
  • drugi monitor to reklama (strona www) oraz pasek informacyjny (jak w drukarce fiskalnej),
  • obydwie aplikacje uruchomione zawsze na tym samym komputerze,
  • środowisko to Windows,

Przesyłany będzie string o długości 40 znaków, nic więcej. Nie potrzebuje żadnego potwierdzenia że doszedł. Program wysyłający nie może nawet kichnąć w trakcie wysyłki (czyli coś lekkiego) i musi być odporny na brak programu odbierającego.

Na teraz najbardziej jestem skłonny do UDP, prosta konfiguracja, odporność na brak serwera. Niby Indy ale już jest używane w programie wysyłającym do komunikacji z innym programem (już sieciowo).
REST-a też bardzo lubię.

Nie znałem WM_COPYDATA - już zerkam.

cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Poznań
  • Postów:8753
2

Aby mieć jakąś unikalną a nie standardowy TForm co pozwoli w bardziej pewny sposób znaleźć i pobrać uchwyt okna.

Ok, jest to jakieś wytłumaczenie. Ale zauważ, że autor wątku pisze, że obie strony gadające ze sobą są jego autorstwa, więc ja bym raczej, zamiast bazować na jakiejś nazwie klasy, dodał jakiś sposób komunikacji/zapoznania się partnerów ze sobą. Chociażby jakiś broadcast UDP, albo jeszcze prościej - skoro sugerujemy zrobić komunikację w oparciu o WM_COPYDATA to wysłać jakiś tekst powitalny do wszystkich okien z taką klasą. Niczym to nie grozi, po prostu - jeśli dane okno tak się nazywa, ale nie jest "kompatybilne" z naszym projektem, to zignoruje powitanie. A jeśli jest chętne do współpracy to odpowie i wtedy już wiemy kto ma z kim gadać.

Przesyłany będzie string o długości 40 znaków, nic więcej. Nie potrzebuje żadnego potwierdzenia że doszedł

Tutaj opcje są dwie - albo ten UDP, co na 99% będzie dochodzić i działać, albo wspomniany komunikat WM_COPYDATA. Przy czym mam wrażenie, że pewniejsze są komunikaty - bo jakakolwiek komunikacja sieciowa może zostać zakłocona, jakiś firewall albo kłopot z ustawieniami karty/konflikt adresów/cokolwiek i masz problem. A komunikaty muszą działać zawsze i wszędzie, stanowią one podstawę działania Windowsa. Jedyny minus że jakby jednak pojawiła się za jakiś czas potrzeba rozdzielenia tych dwóch części na dwie maszyny to wtedy musisz zmienić mechanizm, bo komunikaty działają tylko w obrębie jednego systemu

musi być odporny na brak programu odbierającego

Oba zaproponowane rozwiąznia tak działają - czy to wyślesz komunikat, czy UDP to zasadniczo wysyłasz w świat i potem już nic Cię nie interesuje. Nie jest to list polecony z potwierdzeniem odbioru, gdzie dostajesz żółtą zwrotkę i masz pewność, że odbiorca dostał. To raczej odpowiednik otwarcia okna i krzyknięcia czegoś na ulicę. Nie masz pojęcia czy ktokolwiek to usłyszał. Otwierasz, krzyczysz, zamykasz i nie wiesz co się potem dzieje ;)

REST-a też bardzo lubię.

Biorąc pod uwagę Twój opis potrzeb i sposobu działania, to mamy piękny przykład przysłowiowej armaty na komara :P


edytowany 1x, ostatnio: cerrato
Zobacz pozostałe 2 komentarze
robertz68
przy REST-cie nawet miałem dopisaną uwagę o armacie ale skasowałem :).
SL
Nazywanie resta armatą i proponowanie udp w zamian jest dla mnie niedorzeczne. W UDP nawet nie sprawdzisz w normalny sposób, czy ktoś jest po drugiej stronie
cerrato
@slsy: a czytałeś wymagania, które podał Robert? Napisał, że nie potrzebuje żadnych potwierdzeń, za to apka nadająca ma być odporna na brak drugiej strony. Czyli innymi słowy - wysyła sobie jakaś wiadomość w świat i potem ma wywalone, co się stanie, czy dotrze itp. Dlatego broadcast UDP (albo wysłanie komunikatu) jest całkowicie wystarczający, a jakieś 500x prostszy niż wdrażanie CRUDa.
SL
czytałem. TCP jak i HTTP może spróbować wysłać request, złapać błąd i go zignorować/zalogować. Nie wiem jak ciężkie jest to w delphi, w większości języków odebranie/wysłanie requestu http to jedna linia kodu, po prostu nie widzę sensu stosować rozwiązań, które mogą powodować potencjalne bugi nie dając nic w zamian
cerrato
nie mówię, że jest z tym jakoś super dużo zamieszania, ale mimo wszystko - YAGNI i KISS. Wystarczy krzyknięcie "mam wiadomość" i nic więcej? To po co mamy to komplikować i udziwniać? Jak napisał @robertz68 w poście poniżej - po 1 linii u klienta na serwerze i mamy temat ogarnięty. OK, TCP czy cokolwiek stanowego da więcej - ale jeśli mi wystarczy wiertarka z marketu za stówkę to po co mam kupować profesjonalną za 20x więcej?
robertz68
  • Rejestracja:około 18 lat
  • Ostatnio:5 dni
  • Lokalizacja:Zielona Góra
2

chyba jednak zrobię to przez UDP. Kurde, jedna linijka po każdej stronie i sprawa załatwiona. Konfiguracja też do bólu prosta. Co będę kombinował.
dzięki za dyskusję.

PerlMonk
Łapki są piekielnie ważne.
cerrato
@PerlMonk: no oczywiście, przecież tylko po to tutaj siedzimy ;)
PW
  • Rejestracja:ponad 9 lat
  • Ostatnio:3 miesiące
  • Postów:130
2
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Poznań
  • Postów:8753
2

Tylko pamiętaj, że to UDP jest ryzyko, że zostanie zablokowane. Jak to ustawisz raz (jakieś wpisy na firewallu itp) to potem będzie działać, ale ktoś coś naklika albo wejdzie jakaś aktualizacja systemu i jest ryzyko, że się wywali. OK, naprawienie tego to chwila, a szanse niewielkie - ale jednak jest to mniej pewne rozwiązanie niż bazowanie na komunikatach.


robertz68
sam to wdrażam na komputerach klientów więc raczej mnie to nie zaskoczy. A nawet jak przez jakiś czas nie będzie działać to zapewne nawet nikt się nie kapnie.
cerrato
Dlatego - jeśli to jest dla Ciebie OK, to tak właśnie zrób. Plus jest taki, że jak rzucisz to broadcastem to później będzie łatwo (jakby się jednak wizja zmieniła) rozdzielić serwer i klientów na osobne maszyny.
robertz68
dokładnie, to też wziąłem pod uwagę.
pms_enable_synaptics
  • Rejestracja:prawie 3 lata
  • Ostatnio:ponad 2 lata
  • Postów:152
2
robertz68 napisał(a):

Cześć,

słuchajcie, jak przekazać trochę danych (jednego stringa) między dwoma aplikacjami na tym samym komputerze? Obydwie aplikacje będą mojego "pióra" więc rozchodzi mi tylko o to jakiej technologii użyć?
Dane powinny być przekazywane w miarę online, system powinien być odporny na błędy związane z brakiem aplikacji docelowej.
Myślałem o komunikatach, socketach tcp czy lepiej UDP, plikach tekstowych (to najmniej mi się podoba).
Powinno to być lekkie, bo w końcu to prosta sprawa (niby).
Coś zasugerujecie?

Jeśli to ma być na Windows to: https://en.wikipedia.org/wiki/Named_pipe#In_Windows

Ta dwie aplikacje mają działać na tym samym pulpicie? (w sensie tradycyjnym Windows NT 4.0 TS, nie chodzi mi o wirtualny pulpit Windows 10)

edit: pamiętaj, że UDP nie gwarantuje "doręczenia" komunikatu, nawet na localhoscie

edytowany 1x, ostatnio: pms_enable_synaptics
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Tuchów
  • Postów:12152
0

Skoro obie aplikacje są pisane przez OP i obie działają na tym samym komputerze, to pchanie się w rozwiązania sieciowe jest co najmniej dziwne. Sam system posiada rozwiązania do zapewnienia pewnej i sprawnej wymiany danych między procesami. Sam bym celował w shared memory/file mapping.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
Pepe
  • Rejestracja:ponad 22 lata
  • Ostatnio:około godziny
  • Postów:492
3

Wg mnie, najprościej użyć WM_CopyData. Proste i działa.
Coś takiego powinno przesłać tekst z 1 apki do drugiej (nadawca musi znaleźć okno odbiorcy)

Kopiuj
// SENDER APPLICATION
function Set_Output_Text(AText: string): string;
var
  ACopyData    : TCopyDataStruct;
  AData        : UnicodeString;
  AWndHandle   : HWND;
begin
   AWndHandle := FindWindow('TUniqueFormName', nil);
   if AWndHandle = 0 then
      begin
         result := '-1'; // No handle!
      end
   else
      begin
         ZeroMemory(@ACopyData, SizeOf(ACopyData));
         ACopyData.dwData := 123456; // Unique Number
         ACopyData.cbData := 2 * Length(AText);
         ACopyData.lpData := PWideChar(AText);
         result := IntToStr(SendMessageW(AWndHandle, WM_COPYDATA, 0, LPARAM(@ACopyData)));
      end;
end;


// RECEIVER APPLICATION
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes;
type
  TUniqueFormName = class(TForm)
// ...

  protected
    procedure WMCopyData(var Message: TWMCopyData); message WM_COPYDATA;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  

implementation

// WMCopyData
procedure TUniqueFormName.WMCopyData(var Message: TWMCopyData);
var
   S: UnicodeString;
begin
   if Message.CopyDataStruct^.dwData = 123456 then // is the message from the Writer app?
      begin
         SetString(S, PWideChar(Message.CopyDataStruct^.lpData), Message.CopyDataStruct^.cbData div SizeOf(WideChar));
         // S variable is our data!
      end;
end;

-Pawel


pms_enable_synaptics
  • Rejestracja:prawie 3 lata
  • Ostatnio:ponad 2 lata
  • Postów:152
0

@Pepe: Tylko pytanie, czy te aplikacje są na tym samym pulpicie.

Nie zapominajmy, że Windows NT jest systemem wielodostępnym, tylko ta wielodostępność jest w wersjach nieserwerowych mocno okrojona.

Ale jeśli to jest Windows Server z RDS, a aplikacje są uruchomione w różnych sesjach, to WM_COPYDATA najpewniej nie zadziała.

cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Poznań
  • Postów:8753
0

Ale jeśli to jest Windows Server z RDS, a aplikacje są uruchomione w różnych sesjach, to WM_COPYDATA najpewniej nie zadziała.

OP pisał gdzieś, że ten komp to jakiś POS, więc pewnie zwykły Windows desktopowy z odpalonym jednym loginem fizycznie - żadne RDP czy inne terminale. Raczej tutaj bym nie szukał potencjalnego fakapu.


edytowany 1x, ostatnio: cerrato
B1
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 2 lata
  • Postów:15
0

jak na tym samym kompie ma to sie odbywać to może offline po prostu string sie bedzie zapisywał do pliku TXT i drugi program go będzie odczytywał i tyle

GS
  • Rejestracja:ponad 14 lat
  • Ostatnio:2 minuty
1

To tylko moja prywatna opinia, ale uważam że sockety i protokół TCP/IP lub UDP są najlepszymi narzędziami do komunikacji między aplikacjami.
To są narzędzia uniwersalne dające możliwość międzyplatformowej wymiany pomiędzy różnymi aplikacjami działającymi na dowolnych hostach

edytowany 3x, ostatnio: grzegorz_so
_13th_Dragon
Chrzani Waść boś nie przeczytał nawet tytułu postu - ... na tym samym komputerze
GS
Nie chrzanię ... Przeczytałem !!!!
GS
  • Rejestracja:ponad 14 lat
  • Ostatnio:2 minuty
0

@_13th_Dragon:
nie chrzanię i znam temat postu
PS. Omyłkowo zamiast zedytować komentarz usunąłem mój cały post,

Zobacz pozostałe 3 komentarze
_13th_Dragon
Czyli nawet nie przeczytałeś pytania od OP
GS
@_13th_Dragon: Czyli nawet nie przeczytałeś pytania od OP.... przeczytałem ... OP .... "Dane powinny być przekazywane w miarę online, system powinien być odporny na błędy związane z brakiem aplikacji docelowej. Myślałem o komunikatach, socketach tcp czy lepiej UDP"
_13th_Dragon
Powinno to być lekkie, bo w końcu to prosta sprawa - to też przeczytałeś?
cerrato
@grzegorz_so: skoro omyłkowo usunąłeś post, to go przywróciłem. Jest teraz OK?
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

Wystarczy SharedMemory.
Mapujesz na rekord:
packed record data:byte; next:boolean; end;
nadawca - wpisuje w data kolejny bajt danych i ustawia: next:=true; i czeka na next=false
odbiorca - czeka na next=true wczytuje bajt danych i ustawia: next:=false;
po obu stronach wątek ze strumieniami.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Tuchów
  • Postów:12152
0

Trochę to z tyłka. Przekazywanie danych bajt po bajcie to najwolniejsze rozwiązanie, jakie tylko można sobie wyobrazić. W dodatku pakowanie struktury jeszcze bardziej spowolni cały proces ().

Równie dobrze można użyć zwykłego wskaźnika dla danych. Jedna strona alokuje blok pamięci i wpisuje tyle danych ile trzeba przekazać. Druga strona odbiera te dane i kopiuje lub robi co tylko chce. Strona przekazująca dane czeka aż wskaźnik będzie nilem, a następnie alokuje pamięć i wpycha dane. Strona odbierająca czeka aż wskaźnik będzie różny od nil, a następnie wykorzystuje przekazane dane i na koniec ustawia wskaźnik na nil.

Nie dość, że będzie to działać znacznie szybciej, to w dodatku wystarczy tylko jedna zmienna, czyli wskaźnik dający dwie informacje. Pierwszą jest adres jako zielone lub czerwone światło, drugą jest bufor danych, na który wskazuje.

Obstawiam, że da się to nawet zrównoleglić, czyli jedna strona może generować dane, podczas gdy druga je w tym samym czasie odczytywać. Oczywiście nie w formie jednego, wspólnego bloku pamięci, bo tak to się nie da. Jeśli jedna strona wygeneruje dane, druga może sobie skopiować adres wskaźnika i zmienną ustawić na nil, aby od razu dać zielone światło tej pierwszej, żeby generowała kolejny pakiet danych, a w tym czasie strona druga sobie kopiuje/używa to co dostała.

W ten sposób bym kombinował.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 3x, ostatnio: flowCRANE
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
1

Chyba zapomniałeś że jedna strona zaalokowała zaś druga pod tym adresem nic nie widzi bo ma inną adresacje wirtualną.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Tuchów
  • Postów:12152
0

Ów adres nie musi być traktowany jako faktyczny, natywny wskaźnik — może być adresem liczbowym, wysyłanym w zwykłym komunikacie. Natomiast named shared memory pozwala za pomocą jednego obiektu wymieniać bufory danych o dowolnym rozmiarze. Można zarezerwować obiekt o rozmiarze dwóch paczek danych, tak aby jedna strona zapisywała dane w jednej części, a druga czytała w tym czasie z drugiej części. A potem flip jak w double-bufferingu GPU, i tak w kółko.

Natomiast sprawdzanie tego która strona ma działać, a która czekać, powinno być raczej zaimplementowane nie na podstawie zawartości bufora (jak u Ciebie na podstawie pola next), a za pomocą odpowiednich mechanizmów synchronizacyjnych. Myślę, że muteksty by się nadały, bo są widoczne w obrębie całego systemu.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 8x, ostatnio: flowCRANE
_13th_Dragon
Nie podoba się next to nazwij ready
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
1

@furious programming widzę że już zrozumiałeś że adres i nil nie zadziała, to dobrze.
Więc proponujesz mutex'a zamiast zwyklej zmiennej boolean doprawdy?
Przypominam że masz dostawca-odbiorca 1:1


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M4
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 miesiące
  • Postów:67
0

Przeczytałem ostatnie 4 posty, więc nie wiem jakie propozycje padły wcześniej. Prosty sposób jaki zrobiłem daaaawno temu "na szybko" polegał na zastosowaniu zwykłego pliku tekstowego który był osią wymiany informacji pomiędzy dwoma różnymi programami.
W razie czego nie bić, chciałem pomóc na szybko... :)


edytowany 1x, ostatnio: machinebyte4
PD
W Lazarusie możesz skorzystać z SimpleIPC: https://wiki.freepascal.org/SimpleIPC
M4
Sposób przeze mnie opisany nie był mi już nigdy potem potrzebny, ale miło zapoznać się z nieznaną dla mnie funkcjonalnością Lazarusa :)
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Tuchów
  • Postów:12152
0

@_13th_Dragon: i co, dostawca i odbiorca mają rżnąć CPU (czyli wykonywać absolutnie bezsensowny busy waiting), w ten sposób czekając na to aby zapisać/odebrać dane? Po to właśnie wymyślono mechanizmy synchronizacyjne jak choćby muteksy/semafory i WaitForSingleObject (przy okazji z timeoutami), aby takich głupot nie robić. Nie dość, że sugerujesz marnowanie mocy CPU na niebezpieczną bieda-synchronizację, to jeszcze proponujesz wymianę danych po jednym bajcie — jedno i drugie jest najgorszym z możliwych rozwiązań.

No ale spoko, nie będę się wykłócał.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 6x, ostatnio: flowCRANE
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)