[#1] Sugnaly IDCMP dla okna.
Czesc,

czy jest mozliwosc by aplikacja sprawdzala port wiadomosci dla okna gdy jest otwarte gorne menu np lub file requester albo gdy jestem w trakcie przesuwania okna (powiedzmy juz z 6 sekund trzymam za belke przesuwania).
W momencie jednej z wymienionych operacji program zatrzymuje sprawdzanie portu wiadomosci i gdy bufory z danymi zostana wyczyszczone, odgrywanie piosenki staje do momentu gry okno bedzie znow aktywne.

Dzieki
[#2] Re: Sugnaly IDCMP dla okna.

@peceha, post #1

Nie. Zrobić odtwarzanie na osobnym procesie.
[#3] Re: Sugnaly IDCMP dla okna.

@kiero, post #2

Dzieki.
[#4] Re: Sugnaly IDCMP dla okna.

@kiero, post #2

No i przyszla kolej na ... osobny proces

Na razie czytalem tylko ogolnie i nawet nie wiem jak mialbym komunikowac ten drugi proces z moim programem, a komenda CreateNewProc() to wciaz czarna magia.
Moglby ktos mi zaoszcedzc czasu i napisac co to NP_Seglist lub NP_Entry ?
Czy mam uzyc LoadSeg()? o co tu wogole chodzi....
co to jest "Scatterload a loadable file into memory"
Czy to wszystko bedzie mi potrzebne by wystartowac drugi proces z mojego programu?
[#5] Re: Sugnaly IDCMP dla okna.

@peceha, post #4

Na razie czytalem tylko ogolnie i nawet nie wiem jak mialbym komunikowac ten drugi proces z moim programem, a komenda CreateNewProc() to wciaz czarna magia.

Procesy komunikują się przez porty. Po prostu tworzysz port za pomocą CreateMsgPort(), przekazujesz tworzonemu procesowi (jako parametr dla CreateNewProc()) a następnie wysyłasz (PutMsg()) oraz odbierasz (GetMsg()) wiadomości.

Moglby ktos mi zaoszcedzc czasu i napisac co to NP_Seglist lub NP_Entry ?
Czy mam uzyc LoadSeg()? o co tu wogole chodzi....
co to jest "Scatterload a loadable file into memory"
Czy to wszystko bedzie mi potrzebne by wystartowac drugi proces z mojego programu?

Ten nowy proces musi mieć uruchomiony jakiś program. LoadSeg() ładuje ten program z pliku wykonywalnego. Program wykonywalny to lista segmentów, w których każdy może mieć inny typ (kod, dane) oraz być umiejscowiony w różnych obszarach pamięci (CHIP, FAST).

Można też załadować program procesu z adresu pamięci. I tu przydaje się NP_Entry.

Ostatnia aktualizacja: 29.09.2019 15:18:22 przez Hexmage960
[#6] Re: Sugnaly IDCMP dla okna.

@peceha, post #4

LoadSeg laduje wykonywalny program z dysku do pamieci, dokonujac niezbednych relokacji.
Zwraca liste segmentow, ktore zostaly utworzone w trakcie ladowania.
CreateNewProc tworzy nowy proces, tagi NP_SegList, NP_Entry definiuja sposob jego uruchomienia.
Tag NP_SegList podajesz, gdy program do wykonania zostal zaladowany za pomoca LoadSeg - to, co otrzymales z LoadSeg podajesz jako wartosc NP_LoadSeg.
Tag NP_Entry podajesz, gdy chcesz uruchomic program, bedacy juz w pamieci. Wartoscia NP_Entry jest pointer do funkcji, ktora chcesz wywolac.
W twoim przypadku korzystasz z CreateNewProc z NP_Entry.

Ostatnia aktualizacja: 29.09.2019 15:23:50 przez docent
[#7] Re: Sugnaly IDCMP dla okna.

@docent, post #6

Dzieki za wyjasnienia (wstepne). Przynajmniej nie jest to juz TOTALNA abstrakcja.

Teraz biore sie za lezenie i twarienie tego :)
[#8] Re: Sugnaly IDCMP dla okna.

@peceha, post #4

Ja uzywam czegos takiego (w uproszczeniu) [C]:

struct Process *Proc_Procedura = NULL;
struct Task    *Task_MainTask;

void Procedura(void);

int main(void)
{
        T_MainTask = FindTask(NULL); 

        Proc_Procedura = CreateNewProcTags(NP_Entry, (ULONG)&Procedura,
                                   NP_Priority, 0,
                                   NP_Name, (ULONG)"Cos_tam",
                                   TAG_END);

// jaks dalsza czesc programu
.....

// przy zakonczeniu calego programu czekaj az drugi task skonczy

        Wait(SIGBREAKF_CTRL_C);
}

void Procedura(void)
{
...... // jakas procedura


// a teraz wyjscie przy zamykaniu programu

        Forbid();
        Signal(T_MainTask, SIGBREAKF_CTRL_C);
        Permit();
}


Ostatnia aktualizacja: 29.09.2019 21:04:26 przez Phibrizzo
[#9] Re: Sugnaly IDCMP dla okna.

@Phibrizzo, post #8

Super!
Czyli juz wiem na czym stoje (znaczy ... wydaje mi sie ze wiem, bo i tak bede co chwila sie z na czyms zatrzymywal ale rozjasniliscie mi duzo)

Mysle ze jak zrobie ten osobny proces to juz wlasciwie z "duzych" rzeczy nie zostanie nic.

Dzieki wszytskim za wskazowki.
[#10] Re: Sugnaly IDCMP dla okna.

@Phibrizzo, post #8

Twoja propozycja nie do konca spelnia oczekiwania - nie masz zadnej kontroli nad tym, co robi sub task i musisz czekac az sam skonczy dzialanie. Peceha raczej chodzi o sterowanie sub taskiem z glownego procesu tak aby ui nie blokowalo dekodowania plikow, czyli powinno sie zastosowac porty i wiadomosci.

Poza tym dostep do T_MainTask powinien byc zabezpieczony mutexem lub semaforem zamiast Forbid/Permit
[#11] Re: Sugnaly IDCMP dla okna.

@Hexmage960, post #5

Procesy komunikują się przez porty. Po prostu tworzysz port za pomocą CreateMsgPort(), przekazujesz tworzonemu procesowi (jako parametr dla CreateNewProc()) a następnie wysyłasz (PutMsg()) oraz odbierasz (GetMsg()) wiadomości.


To rozwiazanie jest odwrotne od oczekiwanego przez peceha - tylko task, ktory utworzyl port moze czekac na wiadomosci do niego przychodzace, wiec sub task nie bedzie mogl czekac na wiadomosci na przekazanym porcie, bedzie mogl tylko je wysylac do tego portu.
Wynika to z tego, ze CreateMsgPort alokuje sygnal dla tworzonego portu a sygnaly sa alokowane z puli tasku, ktory wywolal AllocSignal - w tym przypadku bedzie to glowny task.
[#12] Re: Sugnaly IDCMP dla okna.

@docent, post #10


Poza tym dostep do T_MainTask powinien byc zabezpieczony mutexem lub semaforem zamiast Forbid/Permit


Nie. Nie w tym wypadku. Tutaj proces potomny sygnalizuje proces glowny ze skonczyl prace. Dopiero w tym momencie proces glowny tez moze zakonczyc dzialanie. Ten przykladowy kod ma jednak blad - tam nie powinno byc zadnego Permit.

Dziala to w ten sposob:

1. W czasie tworzenia procesu potomnego jest startowana przykladowa funkcja. Stos ustawiony jest tak, ze po jej zakonczeniu zostanie wywolane automatycznie RemTask.
2. Proces potomny konczy dzialanie i zamierza to zasygnalizowac procesowi glownemu. W tym celu wywoluje Forbid() po to, aby zablokowach scheduler.
3. Proces potomny wysyla sygnal do procesu glownego i konczy dzialanie. Scheduler jest nadal zablokowany (TDNestCnt >= 0)
4. W momencie wywolania RemTask proces jest usuwany, na jego miejsce uruchamiany jest pierwszy wolny w kolejce aktualizujac jednoczesnie pole TDNestCnt i ewentualnie odblokowujac scheduler. Najprawdopodobniej zostanie obudzony proces glowny ktory wlasnie w tym momencie moze obsluzyc nadeslany sygnal.

Wywolanie Permit() po wyslaniu sygnalu to proszenie sie o klopoty, zwlaszcza jezeli ten sygnal pozwoli procesowi glownemu zakonczyc dzialanie. W zaleznosci od tego w jakiej relacji byly priorytety obu procesow i w zaleznosci od poziomu pecha moze sie nic nie wydarzyc, moze ewentualnie zadzialac albo moze sie wszystko wysypac. W podobny sposob odsyla sie WBMessage w programach uruchamianych z Workbencha: Forbid() - ReplyMsg() - koniec programu (bez Permit()).

Peceha raczej chodzi o sterowanie sub taskiem z glownego procesu tak aby ui nie blokowalo dekodowania plikow, czyli powinno sie zastosowac porty i wiadomosci.


W tym wypadku zrobilbym to tak:

1. Proces glowny inicjalizuje zmienna globalna T_MainTask (FindTask(NULL)).
2. Proces glowny tworzy nowy proces po czym natychmiast czeka na sygnal. W tym wypadku nie uzylbym sygnalu CTRL_C tylko czegos bardziej stosownego jak na przyklad SINGLE (uzywany tez np. przy semaforach)
3. Proces potomny inicjalizuje wszystko co potrzebne do komunikacji z procesem glownym: MessagePort i wszystko inne.
4. Proces potomny wysyla do T_MainTask sygnal SINGLE: Signal(T_MainTask, SIGBREAKF_SINGLE) po czym przechodzi do petli w ktorej obsluguje komunikacje z glownym procesem i wykonuje prace do ktorej zostal stworzony.

Zakonczenie pracy mozna zsynchronizowac w podobny sposob, byle tylko po ostatnim sygnale wyslanym z potomnego procesu nie odblokowywac schedulera.
[#13] Re: Sugnaly IDCMP dla okna.

@mschulz, post #12

W tym wypadku nie uzylbym sygnalu CTRL_C tylko czegos bardziej stosownego jak na przyklad SINGLE


Absolutnie nie wolno używać SIGB_SINGLE. Możesz odblokować randomowy semafor w ten sposób. Od tego jest AllocSignal.
[#14] Re: Sugnaly IDCMP dla okna.

@Jacek Piszczek, post #13

Absolutnie nie wolno używać SIGB_SINGLE. Możesz odblokować randomowy semafor w ten sposób. Od tego jest AllocSignal.


Niech bedzie. Chociaz w ten sposob mozna by przez przypadek odblokowac tylko semafor na ktory czeka proces glowny miedzy CreateNewProcTags() i Wait(). No, ale powiedzmy ze jest tam gdzies po drodze semafor, wiec tak, lepiej nie uzywac SIGB_SINGLE :)
[#15] Re: Sugnaly IDCMP dla okna.

@mschulz, post #12


1. W czasie tworzenia procesu potomnego jest startowana przykladowa funkcja. Stos ustawiony jest tak, ze po jej zakonczeniu zostanie wywolane automatycznie RemTask.

A dokladniej, CreateNewProc wywoluje AddTask z finalPC ustawionym na wlasna funkcje, ktora przy zakonczeniu utworzonego procesu zwalnia pamiec (segmenty itp) i wywoluje na koniec RemTask(NULL).

Wywolanie Permit() po wyslaniu sygnalu to proszenie sie o klopoty, zwlaszcza jezeli ten sygnal pozwoli procesowi glownemu zakonczyc dzialanie. W zaleznosci od tego w jakiej relacji byly priorytety obu procesow i w zaleznosci od poziomu pecha moze sie nic nie wydarzyc, moze ewentualnie zadzialac albo moze sie wszystko wysypac.

To od pecha nie zalezy :)
Jesli uzyjesz Permit, to wywola on scheduler - w efekcie sa 4 mozliwosci zachowania sie systemu:
1. Jesli biezacy task (sub task) jest w stanie wyjatku, wywoluje jego obsluge wyjatku z TaskExceptCode
2. Jesli nastepny gotowy task ma wiekszy priorytet, jest on przelaczany i wykonywany
3. Jesli nastepny gotowy task ma mniejszy/rowny priorytet i quantum subtasku jeszcze nie minelo -> subtask jest dalej wykonywany
4. Jesli nastepny gotowy task ma mniejszy/rowny priorytet i quantum subtasku juz minelo -> nastepny gotowy task jest przelaczany i wykonywany

Klopoty moga sie pojawic tylko w przypadku 2 i 4, gdy glowny task ma priorytet wyzszy/rowny priorytetowi sub tasku i moze zakonczyc prace przed sub taskiem, co moze zakonczyc sie crashem. Jesli glowny task ma ten sam priorytet co sub task to punkt 2 nie ma znaczenia i pozostaje tylko punkt 4
Wystarczy wiec by sub task mial priorytet wiekszy od glownego by zastosowanie Permit bylo calkowicie bezpieczne.

W tym wypadku zrobilbym to tak:

1. Proces glowny inicjalizuje zmienna globalna T_MainTask (FindTask(NULL)).
2. Proces glowny tworzy nowy proces po czym natychmiast czeka na sygnal. W tym wypadku nie uzylbym sygnalu CTRL_C tylko czegos bardziej stosownego jak na przyklad SINGLE (uzywany tez np. przy semaforach)
3. Proces potomny inicjalizuje wszystko co potrzebne do komunikacji z procesem glownym: MessagePort i wszystko inne.
4. Proces potomny wysyla do T_MainTask sygnal SINGLE: Signal(T_MainTask, SIGBREAKF_SINGLE) po czym przechodzi do petli w ktorej obsluguje komunikacje z glownym procesem i wykonuje prace do ktorej zostal stworzony.

Zakonczenie pracy mozna zsynchronizowac w podobny sposob, byle tylko po ostatnim sygnale wyslanym z potomnego procesu nie odblokowywac schedulera.

Ja bym zrobil troche inaczej - sygnaly sa dosyc niskopoziomowe i zamiast nich
wykorzystalbym msgport do zablokowania glownego tasku zanim sub task zainicjalizuje swoj port do komunikacji. Czyli
1. w glownym tasku utworzyc port, przekazac go jako parameter do sub tasku i czekac na tym porcie na wiadomosc od sub tasku.
2. W sub tasku utworzyc jego prywatny port i ustawic go jako replyport w wiadomosci startowej wyslanej do glownego tasku i czekac na prywatnym porcie na komendy
3. w glownym tasku odebrac wiadomosc startowa od sub tasku i wziac z replyport w wiadomosci port do dalszej komunikacji z sub taskiem.
4. Sub task konczy prace po otrzymaniu wiadomosci konczacej i odpowiedzeniu na nia

Dzieki takiemu rozwiazaniu pozbywamy sie globalnej zmiennej i mamy w miare jednolity protokol komunikacji miedzy taskami. No i SIGBREAKF_SINGLE nie jest najszczesliwszym wyborem - to takie hakerskie rozwiazanie, ktore w tym przypadku pewnie zadziala, ale tylko jesli nie bedzie zadnych systemowych wywolan pomiedzy SetSignal a Wait. Latwo tu o jakies przeoczenie i trudny do zlokalizowania blad, lepiej tak jak pisal Jacek, zaalokowac wlasny signal do tego celu.
[#16] Re: Sugnaly IDCMP dla okna.

@docent, post #15

To od pecha nie zalezy :)
Jesli uzyjesz Permit, to wywola on scheduler - w efekcie sa 4 mozliwosci zachowania sie systemu:
1. Jesli biezacy task (sub task) jest w stanie wyjatku, wywoluje jego obsluge wyjatku z TaskExceptCode
2. Jesli nastepny gotowy task ma wiekszy priorytet, jest on przelaczany i wykonywany
3. Jesli nastepny gotowy task ma mniejszy/rowny priorytet i quantum subtasku jeszcze nie minelo -> subtask jest dalej wykonywany
4. Jesli nastepny gotowy task ma mniejszy/rowny priorytet i quantum subtasku juz minelo -> nastepny gotowy task jest przelaczany i wykonywany

Klopoty moga sie pojawic tylko w przypadku 2 i 4, gdy glowny task ma priorytet wyzszy/rowny priorytetowi sub tasku i moze zakonczyc prace przed sub taskiem, co moze zakonczyc sie crashem. Jesli glowny task ma ten sam priorytet co sub task to punkt 2 nie ma znaczenia i pozostaje tylko punkt 4
Wystarczy wiec by sub task mial priorytet wiekszy od glownego by zastosowanie Permit bylo calkowicie bezpieczne.


Dokladnie. Ale skoro juz o porzadnym programowaniu mowimy a nie o brzydkich hakach, na dokladke nie kontrolujemy quantum, to nie zakladajmy z gory ze ustawienie wyzszego priorytetu zalatwia sprawe na zawsze. Wystarczy ze Pecha zmieni kiedys priorytet subtasku z jakiegos powodu zapominajac o tym, ze uzyl "calkowicie" bezpiecznego Permit() albo zainstaluje sobie jakis super-hiper nowy scheduler ktory nie bedzie sie trzymal wyzej wymienionych zasad. Pozwol ze zacytuje jednoczesnie lekko modyfikujac cytat (modyfikacja pogrubiona ):


to takie hakerskie rozwiazanie, ktore w tym przypadku pewnie zadziala, ale tylko jesli subtask ma wyzszy priorytet niz glowny task. Latwo tu o jakies przeoczenie i trudny do zlokalizowania blad


A z mojej strony, widzialem juz i poprawialem kod ktorego autor mial podobne zalozenia tyle ze odnosnie momentu tworzenia subtasku. Potem zmienil priorytety i trzeba bylo grzebac w kodzie i dociekac dlaczego subtask widzi pewne zmiennie niezainicjalizowane, mimo ze przeciez sa w kodzie ustawione ;)

Ostatnia aktualizacja: 01.10.2019 14:01:24 przez mschulz

Ostatnia aktualizacja: 01.10.2019 14:03:12 przez mschulz
[#17] Re: Sugnaly IDCMP dla okna.

@mschulz, post #16

A może po prostu taski niech się wymienią adresem pamięci (przez port) pod którym będą sygnalizowały wzajemny status/dane etc? Wtedy w kaźdym momencie działania subtaska (każdej pętli itp.) można go na szybko sprawdzać niczego nie blokując. Oczywiście musi być tam też sygnalizacja końca głównego tasku i podjęte odpowiednie działania.
[#18] Re: Sugnaly IDCMP dla okna.

@mschulz, post #16

na dokladke nie kontrolujemy quantum,

Quantum mozna kontrolowac - pole Quantum i Elapsed w ExecBase sa ogolnodostepne. Na upartego mozemy nawet kontrolowac scheduler czy wstawic swoj - funkcje w rodzaju Schedule, Reschedule, Dispatch, Switch maja swoje offsety w exec.library, ktore sa wykorzystywane i mozna je zmodyfikowac SetFunction. Nie jest to oficjalnie wspierane ale w pierwszych wersjach systemowych includes te offsety byly podane i dopiero w pozniejszych wersjach sa juz Private.
to nie zakladajmy z gory ze ustawienie wyzszego priorytetu zalatwia sprawe na zawsze.
Tego nie napisalem

Wystarczy ze Pecha zmieni kiedys priorytet subtasku z jakiegos powodu zapominajac o tym, ze uzyl "calkowicie" bezpiecznego Permit() albo zainstaluje sobie jakis super-hiper nowy scheduler ktory nie bedzie sie trzymal wyzej wymienionych zasad.

To samo mozna tez powiedziec o rozwiazaniu bez Permit - super-hiper scheduler moze tez zmodyfikowac dzialanie Forbid tak, ze to rozwiazanie nie zadziala poprawnie. System oficjalnie nie wspiera takich hackow, wiec ryzyko jest w obu przypadkach.
Uzycie Permit bedzie bezpieczne, dopoki system bedzie w znanym, legalnym stanie a sub task bedzie mial wiekszy priorytet.
Pozwol ze zacytuje jednoczesnie lekko modyfikujac cytat (modyfikacja pogrubiona ):
"to takie hakerskie rozwiazanie, ktore w tym przypadku pewnie zadziala, ale tylko jesli subtask ma wyzszy priorytet niz glowny task. Latwo tu o jakies przeoczenie i trudny do zlokalizowania blad"

Zauwaz, ze pisalem nie o tym, co jest bardziej hackerskie a co nie, ale ze to, co sie stanie po uzyciu Permit nie zalezy od pecha i mozna to dokladnie ocenic i zdefiniowac warunki tak, aby crash nie wystapil.
Nie zmienia to oczywiscie faktu, ze w obu przypadkach nalezy pamietac o rzeczach, o ktorych sie nie powinno pamietac. Niestety amiga nie ma dobrze zdefiniownego sposobu dzialania w takiej sytuacji (jak i w wielu innych :) i kazde rozwiazanie jest hackerskim bo opiera sie na albo na specyficznej, nieudokumentowanej konstrukcji wyjscia z sub tasku (Forbid bez Permit) czy na specyfice dzialania schedulera a nie na porzadnie zdefiniowanym i udokumentowanym api. Co ciekawe, w includes sa slady po probach stworzenia czegos w rodzaju child taskow/threadow, ktorych listy przechowywane byly dla kazdego tasku i zapewne mialy byc jakos usuwane przy konczeniu pracy glownego tasku.

A z mojej strony, widzialem juz i poprawialem kod ktorego autor mial podobne zalozenia tyle ze odnosnie momentu tworzenia subtasku. Potem zmienil priorytety i trzeba bylo grzebac w kodzie i dociekac dlaczego subtask widzi pewne zmiennie niezainicjalizowane, mimo ze przeciez sa w kodzie ustawione ;)

Heh, takie historie w systemach z jakims rodzajem multitaskingu to temat rzeka, programisci i programy amigowe nie wyrozniaja sie jakos szczegolnie negatywnie. Powiedzialbym nawet, ze niektore kwiatki z thedailywtf bija na glowe najgorsze amigowe osiagniecia :)
[#19] Re: Sugnaly IDCMP dla okna.

@peceha, post #1

Mialem problem w wystartowaniu supprocesu z kodu glownego w blitzu (ciagle zwisy) az na EAB mi powiedziano ze nie da rady.

Takze droga jaka przyjalem to 2 osobne programy.
Startuje ten odpowiedzialny za MHI, on tworzy port ogolny a nastepnie poprzez Execute() staruje program odpowiedzialny za cale GUI. Ten z kolei wysyla wiadomosci do ogolnego i odbiera odpowiedzi.
Gdy zamkne okno, wysylana jest wiadomosc z ustawionym polem o zakonczeniu programu i ten odpowiedzialny za MHI zamyka port ogolny odpowiada na te wiadomosc i znika. Jak program GUI odbierze odpowiedz i tam bedzie ustawione pole o zakonczeniu to tez posprzata i sie zamnkie.

Zakladam ze musze otworzyc tez drugi port ogolny z programu odpowiedzialnego za GUI by ten z MHI mogl wysylac informacje o stanie playback-u.

Co by nie bylo, prototyp dziala szeroki uśmiech wiec jest gitara

Mam jedno pytanie, czy na odpowiedzi do wiadomosci tez musze odpowiadac?
Chyba nie?
[#20] Re: Sugnaly IDCMP dla okna.

@peceha, post #19

A może jednak, skoro i tak orzesz w systemie, nauczyć się C? To nie jest trudne. Zaletą „łatwych” języków typu Blitz, czy AMOS jest to, że pozwalają Ci nie znać systemu operacyjnego, dlatego są łatwe. Jednak na poziomie, na którym się znalazłeś, zaleta przekształca się w wadę.

Na odpowiedzi wiadomości nie musisz odpowiadać, bo to by dało nieskończoną pętlę (czy odpowiadać na odpowiedzi na odpowiedzi?...). Mechanizm wiadomość-odpowiedź stanie się zrozumiały, gdy przyjmiesz, że wiadomość, to po prostu przekazanie procesowi docelowemu kontroli nad obszarem pamięci zawartym w wiadomości. Wtedy odpowiedź na wiadomość, to informacja dla procesu, który ją wysłał, że adresat zakończył już działania na tym obszarze pamięci i kontrola nad nią wraca do procesu wysyłającego. Na tym cykl życia danej wiadomości się kończy.
[#21] Re: Sugnaly IDCMP dla okna.

@Krashan, post #20

Zauwazylem, ze Blitz wlasnie staje sie kula u nogi...
Przyklad sprzed dwoch dni:
by pisac "systemowo" potrzeba do blitza specjalnej biblioteki
- rozprowadzana oryginalnie z BB2 ma problem z komenda Wait() gdy uzywam maski a do tego brakuje jej structury AppWindow wiec odpada "drag and drop"
- kolejna wersja (chronologicznie) i nie oficjalna to z aminetu amigalibsii. Fajna sprawa, ze naprawili Wait() i dodali AppWindow ale zapomnieli o DataType oraz BitMapHeader (czyli szlag trafil obsluge datatypes)
- 3cia i ostatnia to "oficjalna" z "duzej" dystrybucji blitza. Dodali brakujace rzeczy ale spieprzyli \fr_NumArgs gdy ustawi sie MULTISELECT (zwracane sa totalne bzdury) - czyli wybieranie kilku plikow na raz do kosza.
-jest jeszcze 4ta opcja "all.res" (dla amiblitz) ale ta wiesza mi amige
To tylko przyklady jakie sam napotkalem piszac proste GUI.

Dodatkowo mam sporo pomyslow ktorych zrealizowac nie moge chocbym nie wiem jak chcial , bo nie da rady spod Blitza.

Dzeki za proste wyjasnienie wiadomosci OK
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem