[#1] Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?
Czesc,
czy uzyc ModifyIDCMP() z ponizszym:

- if the IDCMP for the given window is opened, and the IDCMPFlags
argument is not zero, this means that you want to change the
state of which events will be broadcast to you through the IDCMP

1. na czas deaktywacji podaje jakis malo istotny IDCMP (bo chyba musi byc argument)
2. gdy chce na nowo dostawac IDCMP to wywoluje te komende z pelnym taglist sygnalow IDCM ,ktore mi sa potrzebne

a moze gdy nadchodzi moment ze potrezbuje odpblokowac moje okno to po prostu odpowiadam na wszystkie msg jakie tam sie nagromadzily (nie robiac z nimi nic po drodze) - tylko jak mialbym rozpoznac msg ktore przyszly w trakcie "nieaktywnego" okna

Dzieki


ps
piszac "przyblokowac" mialem na mysli np. taki scenariusz:
program musi wczytac grafike i ja wyswietlic - to zajmuje troche czasu a w miedzy czasie do aktywnego okna dochodza sygnaly od zniecierpliwionego uzytkownika :) o wcisnieciu klawisza, dwukliku na innym pliku itd
w obecnej wersji gdy program poradzi sobie juz z ta grafika i pojawi sie ona na ekranie to wezmie sie za przerabianie tych kolejnych, czekajacych w kolejce eventow ... a chcialbym by je poprostu zignorowal i zaczal nasluchiwac na nowo od moentu gdy skonczy zadanie z grafika

ps.2
hmm, a mozna jakos dezaktywowac okno i by uzytkownik nie mogl go aktywowac kliknieciem? bo przeciez eventy z intuition ida do aktywnego okna.. chyba

Ostatnia aktualizacja: 04.07.2022 21:51:37 przez pch
[#2] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@pch, post #1

piszac "przyblokowac" mialem na mysli np. taki scenariusz:
program musi wczytac grafike i ja wyswietlic - to zajmuje troche czasu a w miedzy czasie do aktywnego okna dochodza sygnaly od zniecierpliwionego uzytkownika :) o wcisnieciu klawisza, dwukliku na innym pliku itd

System Amigi ma dedykowane narzędzie do tego celu. Nazywa się ono Requesterami.

Requester blokuje sygnały IDCMP do okienka do którego jest dodany.

Idealnie nadaje się w sytuacji, gdy wymagamy od użytkownika podjęcia decyzji/wyboru, albo gdy czekamy na zakończenie jakiejś operacji.

Requestery mają swoją strukturę i mogą zawierać proste gadżety, obrazki itp. W praktyce jednak lepiej stworzyć pustą strukturę Requester, przyblokować okno - a następnie wyświetlić informację w oddzielnym okienku.

Poniżej kawałek kodu w C, który przyblokuje sygnały IDCMP do okna:

/* Strukturę Requester inicjujesz przy użyciu: */

struct Requester requester;

InitRequester(&requester);

/* Następnie wywołujesz poleceniem: */

Request(&requester, okno);

/* ... i zamykasz za pomocą funkcji: */

EndRequest(&requester, okno);

Mam pytanie: w czym teraz kodujesz? Blitz Basic, Amiga E, czy C?

Ostatnia aktualizacja: 04.07.2022 22:55:24 przez Hexmage960
[#3] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@pch, post #1

Mozesz to zrobic na 3 sposoby:

1. uzyc ModifyIDCMP
ModifyIDCMP(window, NULL);
.. tu operacja np dekodowanie obrazka...
ModifyIDCMP(window, OriginalIDCMPflags);
Proste i skuteczne, ale kazda taka operacja bedzie powodowala zwolnienie MsgPortu i SignalBit i ponowne zaalokowanie portu i sigbitu.

2. Uzyc ModifyIDCMP
ModifyIDCMP(window, IDCMP_INTUITICKS);
.. tu operacja np dekodowanie obrazka...
ModifyIDCMP(window, OriginalIDCMPflags);
To rozwiazanie nie bedzie zwalniac i realokowac portu. Dodatkowo, Intuition nie bedzie posylac nastepnych IntuiMessage tego typu, dopoki pierwsza nie zostanie obsluzona wiec nie bedzie problemu z kolejkowaniem przychodzacych wiadomosci w porcie. Prawdopodobnie powinienies jeszcze odpowiedziec na wiadomosc w porcie przed drugim wywolaniem ModifyIDCMP.

3. Uzyc osobnego tasku do wykonania operacji i globalnej zmiennej albo semafora do arbitracji
czyli: po wybraniu pliku do wyswietlenia uruchomic task, w ktorym na poczatku trzeba ustawic semafor/zmienna globalna a po zakonczeniu wyzerowac. W glownej petli obslugi eventow IDCMP sprawdzac, czy semafor jest ustawiony i wtedy robic tylko ReplyMsg bez zadnej obslugi przychodzacych eventow.

Jesli nie chcesz aby uzytkownik mogl np. wybrac jakas opcje w programie w czasie wykonywania operacji, to opcja 2 jest najlepsza. W innym przypadku opcja 3. Pomysly z reqesterami mozesz sobie darowac - nie do tego sluza.
[#4] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@Hexmage960, post #2

@Hex
No dalej Blitz, mialem zamiar wystartowac z E ale sie dowiedzialem, ze 11 lipca jade wiec sie mnie odechcialo wszytskiego...


@docent
mozliwosc nr.1 bralem pod uwage ale odpuscilem bo wlasnie wydawala mi sie wolniejsza od nr.2


Tak, sobie przeczytalem o Requeter-ach co Hex zaproponowal i faktycznie przyblokuja IDCMP ale napisane jest tam:
Putting up a requester merely because you are in a phase of the program where it would be difficult to deal with user input is bad style. Modal requesters should be used only when the program requires user interaction before proceeding.

wiec sam nie wiem :)
Dzieki

Ostatnia aktualizacja: 05.07.2022 07:31:13 przez pch
[#5] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@docent, post #3

Pomysly z reqesterami mozesz sobie darowac - nie do tego sluza.

No requestery służą głównie do dokonywania wyboru przez użytkownika. Z powodzeniem można z nich też korzystać w taki sposób, o którym napisałem - otworzyć osobne okienko i zablokować dostęp do nadrzędnego okna poprzez requester bez grafiki.

Tutaj jest o tym napisane: link

Przedstawione są zalety tego rozwiązania - to osobne okienko może być manipulowane, rysowane itd., może mieć własne menu. I może mieć dowolne gadżety, w tym GadTools.

Ja bym tak to zrobił: zablokował IDCMP w oknie nadrzędnym, otworzył okienko z progresem dłuższej operacji, która musi być zakończona przed kontynuacją działania programu z przyciskiem "Anuluj".

W przypadku, gdy dłuższa operacja może być wykonywana niezależnie od reszty programu, to faktycznie można stworzyć osobny Task.

W takiej sytuacji, jeżeli nie musimy blokować IDCMP i jesteśmy gotowi na obsługę wydarzeń to wówczas wykonujemy normalną pętlę naszego programu.
[#6] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@Hexmage960, post #5

Ok, dzieki, na pewno wybiore jedno - wyjdzie w trakcie, ktore bedzie bardziej pasowalo.

Nie planuje operacji wykonywanych niezaleznie od glownej petli programu wiec rozwiazanie z osobnym taskiem nie bedzie potrzebne.
[#7] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@pch, post #6

A nie można chwilowo odbierać i odpowiadać na IDCMP tylko po prostu olewać obsługę zdarzeń?


Ostatnia aktualizacja: 05.07.2022 15:43:54 przez pisklak
[#8] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@pisklak, post #7

nie, bo jak program wezmie sie za wczytywanie/przerabianie grafiki to glowna petla programu stoi dopoki ta operacja sie nie zakonczy, a w miedzyczasie nadchodza sygnaly do okna (ktore so dodawane do kolejki).

Jak program upora sie z grafika to glowna petla ruszy i na dzien dobry program bedzie musial obsluzyc powyzsza kolejke sygnalow - no i teraz jak poznac ktory sygnal jest tym granicznym (czyli pierwszym co przyszedl po ponownym ruszeniu petli glownej programu) ?

Pasowaloby dac obrobke grafiki do osobnego tasku by nie blokowac petli glownej by program mogl odpowiadac na sygnaly (ale nie podejmowac akcji)
[#9] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@pch, post #8

Ja w moim aac zrobiłem sobie funckję:
void VanishIDCMP(void) {
	struct IntuiMessage *msg;

	while( msg = GT_GetIMsg(WinWnd->UserPort) )
		GT_ReplyIMsg( msg );
}


Potem daję to wykonać w odpowiednim miejscu (na koniec skoku albo coś w tym stylu) poza główną pętlą.
[#10] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@pch, post #8

No od biedy można chyba wykorzystać pola seconds i micros ze struktury intuimessage. I olać obsługę wszystkich z czasem pomiędzy startem i końcem renderingu grafiki.
[#11] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@Hexmage960, post #5


No requestery służą głównie do dokonywania wyboru przez użytkownika. Z powodzeniem można z nich też korzystać w taki sposób, o którym napisałem - otworzyć osobne okienko i zablokować dostęp do nadrzędnego okna poprzez requester bez grafiki.

Requestery sluza do wylacznie do komunikacji z uzytkownikiem, gdy potrzebny jest jakis input z jego strony. To, ze mozna je wykorzystac do czego innego nie oznacza, ze tak powinno sie robic.
Tutaj jest o tym napisane: link
Przedstawione są zalety tego rozwiązania - to osobne okienko może być manipulowane, rysowane itd., może mieć własne menu. I może mieć dowolne gadżety, w tym GadTools.

Tekst, do ktorego linkujesz opisuje rozwiazanie, w ktorym zamiast requestera wykorzystuje sie zwykle okno, pelniace jego funkcje a input do glownego okna jest blokowany za pomoca pustego requestera.
Jak sie to ma to pytania autora jak ignorowac przychodzace eventy do glownego okienka?
Ja bym tak to zrobił: zablokował IDCMP w oknie nadrzędnym, otworzył okienko z progresem dłuższej operacji, która musi być zakończona przed kontynuacją działania programu z przyciskiem "Anuluj".

To rozwiazanie wymaga reqularnego sprawdzania i obslugi eventow okienka z progresem, no i aktualizacji progresu w trakcie wykonywania operacji. Nie o to chodzilo, choc z punktu widzenia uzytkownika moze to byc wygodniejsze, szczegolnie gdy operacja zajmuje wiecej czasu.
[#12] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@docent, post #11

Tekst, do ktorego linkujesz opisuje rozwiazanie, w ktorym zamiast requestera wykorzystuje sie zwykle okno, pelniace jego funkcje a input do glownego okna jest blokowany za pomoca pustego requestera.
Jak sie to ma to pytania autora jak ignorowac przychodzace eventy do glownego okienka?

Autorowi wątku chodziło właśnie o blokowanie inputu do głównego okna. Podałem jedno z możliwych rozwiązań, czyli requester.

To okienko dodatkowe nie musi pełnić funkcji okna głównego, tylko może kontrolować aktualną operację.

To rozwiazanie wymaga reqularnego sprawdzania i obslugi eventow okienka z progresem, no i aktualizacji progresu w trakcie wykonywania operacji. Nie o to chodzilo, choc z punktu widzenia uzytkownika moze to byc wygodniejsze, szczegolnie gdy operacja zajmuje wiecej czasu.

To prawda. Trzeba robić to sprawdzanie. Czasami nie jest to możliwe, ale jak np. formatujesz dyskietkę, to można robić to po sektorze, jak dekodujesz obrazek to po linijce. I w tych momentach takie sprawdzanie i aktualizację można wykonać.

Tu się nie upieram. Po prostu wyświetlenie progresu i opcja "Anuluj" jest dla użytkownika mile widziana.

Requestery sluza do wylacznie do komunikacji z uzytkownikiem, gdy potrzebny jest jakis input z jego strony. To, ze mozna je wykorzystac do czego innego nie oznacza, ze tak powinno sie robic.

Zgadzam się. Generalnie chodzi o to, że program wyświetla Requester, gdy czeka na jakąś decyzję użytkownika.

Według mnie takie czekanie na zakończenie operacji można wykonać na kilka równorzędnych sposobów. Zależy to też od natury operacji.

@Cholok

Podana przez Ciebie technika jest również przydatna, gdy chcemy opróżnić bufor wiadomości w porcie komunikacyjnym.

Ostatnia aktualizacja: 05.07.2022 20:57:21 przez Hexmage960
[#13] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@Hexmage960, post #12

Dobra czysto teoretycznie...
1) podczas renderowania grafiki do portu napływają wiadomości ktore nie mogą być tymczasowo obsługiwane
2) każda wiadomość ma "timestamp" w polach imessage secunds micros
3) jak kończymy rendering to sobie wypisujemy w zmienną/zmienne powiedzmy rend_time timestamp zakonczenia renderingu
4) w petli głównej sprawdzamy czy rend_time jest wieksze od 0 i jesli jest to odpuszczamy obsługę kolejnych komunikatów aż dotrzemy do jakiegoś z czasem po naszym renderingu (po prostu tylko odpowiadamy na wiadomośći). Czyścimy rend_time na 0
5) dalsza obsługa idzie normalnie

Coś takiego powinno być OK?
[#14] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@pisklak, post #13

jakos spodobal mi sie pomysl pisklaka i wrzucilem to na 1szy ogien i .... dziala elegancko - no powiedzmy przez godzine testow.

Doszly tylko 3 linijki kodu:
- IF-ENDIF w czesci obslugujacej sygnaly,
- CurrentTime() po zakonczenczu robienia grafiki
1
[#15] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@pch, post #14

Cieszę się że mój pomysł został przetestowany w praktyce i działa szeroki uśmiech
[#16] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@pch, post #8

nie, bo jak program wezmie sie za wczytywanie/przerabianie grafiki to glowna petla programu stoi dopoki ta operacja sie nie zakonczy


Czy tutaj nie powinny już czasem zostać użyte task'i? Bo jeżeli coś będzie się renderowało przez pół godziny, to masz przez ten czas uruchomiony program, który reaguje akcje użytkownika i nie możesz go nawet zamknąć lub przerwać renderingu.
Może uruchomiać (i wyłączać na koniec) przerwanie wraz z renderingiem na vblank (co 20ms w PAL chyba) i odpowiadać tam na wiadomości i reagować na najważniejsze z nich, np. ustawiając zmienne do komunikacji z silnikiem?

W tym ostatnim rozwiązaniu zastanawiam się czy byłyby jakieś komplikacje, gdyby ktoś podczas renderingu zmieni sobie godzinę w Amidze.


Ostatnia aktualizacja: 06.07.2022 14:03:54 przez san_u
[#17] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@san_u, post #16

W tym ostatnim rozwiązaniu zastanawiam się czy byłyby jakieś komplikacje, gdyby ktoś podczas renderingu zmieni sobie godzinę w Amidze.

Moga byc, bo czas wstawiany do kazdej wiadomosci jest brany z zegara systemowego - jesli go sie np. przesunie do tylu, to przy tescie polegajacym na porownaniu z biezaca data wiadomosci, otrzymane w trakcie renderowania moga zastac potraktowane jako otrzymane juz po zakonczeniu renderowania.
[#18] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@san_u, post #16

To cale "generowanie/przetwarzanie grafiki" o ktorej tu mowa to kwestia paru sekund - tyle ile potrezbuje system na wczytanie (+ odpowiednie dopasowanie) pliku za pomoca datatypes

Nawet nie wiem czy multiview korzysta z osobnego tasku przy wczytywaniu pliku.
Od biedy moglbym dac osobny task...
[#19] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@pch, post #18

No nic innego oprócz wydelegowania renderingu do osobnego taska się chyba nie wymyśli. Bo po prostu te renderowanie "blokuje" dostep do obsługi IDCMP. Ale to raczej w przypadkach gdy ten rendering jest naprawdę długi. Tutaj na te kilka sekund to rozwiązanie jest chyba całkiem wystarczające. No chyba że ktoś będzie chciał dekodować obrazki w jakichś kosmicznych rozdzielczościach na biednym 68000
[#20] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@pch, post #18

To była taka sugestia jeśli chodzi o taski, by wykorzystać możliwości jakie daje AOS, ale jeśli program ma być faktycznie nieczynny tylko chwilę i spełnia swoje zadanie, to wszystko zależy już od ciebie jak bardzo chcesz go doszlifować lub z nim poeksperymentować.
[#21] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@san_u, post #20

wlasnie ma byc "nie czynny" :) - dlatego pytanie bylo jak przyblokowac na pewien czas sygnaly dochadzace do okna.
[#22] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@pch, post #21

Na systemie to sie nie znam, ale z tego co pamietam jest cos takiego jak "cursor is busy". Wedlug mnie to powinno wystarczyc, zeby zablokowac wysylanie wszelkich akcji myszka.
[#23] Re: Jak "na chwile przyblokowac" IDCMP, ktore dochodza do okna?

@Don_Adan, post #22

Od wersji v39 mozesz zmienic sobie wyglad kursora na taki jaki jest zdefiniowany w systemie jako "busy" przez SetWindowPointer, ale nie ma to zadnego wplywu na przychodzace eventy.
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