Hírek | Archívum | Fórum | IRC | Amiga | AmigaOS | FAQ | RSS

 - Fórumok - Regisztráció - Keresés - Statisztika - Szabályzat - Pegasos.hu fórum
forum.amigaspirit.hu / Fejlesztés / Escape-re kilépés
Szerző Üzenet
Travis
Tag
# Elküldve: 2010. Feb. 05. 14:41


Sziasztok!

Egy tutorial alapján a következő OS3.1 alatt futó programmal van problémám:

#include <exec/types.h>
#include <hardware/cia.h>
#define CIAA 0xBFE001

struct CIA *cia = (struct CIA *) CIAA;

int main()
{
int loop;
while(1){
printf("%i\n", cia->ciasdr);
if(cia->ciasdr == 117) break;/* Escape pressed */
}
}

A funkció billentyűkre megfelelően reagál, de az escape és betűt, számot tartalmazó billentyűk esetén megáll, és addig nem megy tovább, míg az entert le nem ütöm. Hogyan lehet megoldani, hogy egyből kilépjen? Nekem, laikusnak úgy tűnik, mintha a vezérlést megkapná a CLI, mert a program befejeződése után unknown command hibaüzenetet ír ki.
A válaszokat előre is köszönöm.

Chain-Q
Divatamigás

# Elküldve: 2010. Feb. 05. 15:21 - Szerkesztve: charlie


KEYBOARD HANDLING ON AMIGA: YOU'RE DOING IT WRONG.

Amikor nem tiltod le a multitaszkot, es párhuzamosan a CIA-t baszkodod, akkor gyakorlatilag "versenyzel" a hardver elérésében a rendszer drivereivel, pl. az input.device-vel, és magával a konzollal (CON: eszköz). Valószínűleg Escape és szám megkapása esetén a konzol megáll, és addig nem folytatja, amíg a "parancsot" be nem gépelted (Enter gomb). Ezért a programod I/O-ja a printf()-ben blokkolódik ilyenkor. Ezért látod úgy, hogy "megállt" a végrehajtás.

Megoldás 1.:
Tiltsd le a programod futása közben a multitaskot. Ez a legegyszerűbb és egyben legfavágóbb (valamint erősen ellenjavalt, 2010-ben) megoldás. Az exec.library Disable(); illetve Forbid(); függvényét érdemes nézegetni...

Megoldás 2:
Nyitsz egy saját ablakot, és annak a MessagePort-járól olvasod az üzeneteket, ahol igényeid szerint megkaphatod a gombokat (vagy akár egérmozgásokat, gombokat) mindenféle kóddal és kombinációban (OpenWindow() függvény és a hozzá való IDCMP_ flagek, valamint GetMsg() függvény és környéke). 2010-ben ez a civilizált megoldás, valamint megy az összes Next Gen OS-sel is. Attól, hogy saját ablakod van, pedig még printf()-elhetsz a CON:-ra nyugodtan. Előbb utóbb ha rajzolni akarsz, vagy bármit megjeleníteni, úgyis saját ablakod lesz.

A message kezelés overheadje Amigán pedig igen kicsi. Gyakorlatilag egy közepes 68k-n is elhanyagolható.

Megoldás 3:
A kettő kombinációja, kihekkeled a rendszerből az aktuális CON: ablak handle-jét, és felülbírálod a Message kezelését. Erősen ellenjavalt, de megoldható...

Megoldás 4:
Asszem valahogy át lehet kapcsolni a konzolt olyan módba (RAW:), hogy ne kezelje az escape szekvenciákat, meg semmi ilyesmit. De ezt sosem csináltam, tehát az nem lehet, mert nem tudom. :P

Megoldás 5:
input.device baszkodása közvetlenül. Szintén ellenjavalt, főleg mert kb. ugyanaz a végeredmény mint az OpenWindow-os message-kezelős módszer, csak bonyolultabb és több a buktatója. :)

Összefoglalva, a lényeg, hogy a hardver közvetlen támadása és a rendszer közös használata az átlagosnál is nagyobb körültekintést igényel... És ha csak nem akarsz hiperbrutális copper/blitter mágiákat a custom chipsetben, felesleges is. Főleg ilyesmihez, hogy keyboard és/vagy egérkezelés.

Egyébként pont a CON: és a billentyűzetkezelés relatív nehézkessége miatt, Amigán a nem rendszerbarát, hardvert teljesen kontroll alá vonó programok általában nem ESC-re, hanem bal, vagy méginkább jobb egérgombra lépnek ki, mert ahhoz elég csak egy BTST utasítás az egyik CIA regiszterre, ráadásul a billentyűzethez képest nincsenek káros mellékhatásai az utána visszatérő rendszerre nézve.

Travis
Tag
# Elküldve: 2010. Feb. 05. 16:01


Akkor ez egy újabb érv az ablak nyitása mellett. A kettős bufferelést is megpróbáltam saját ViewPorttal megoldani és nem ment.

Chain-Q
Divatamigás

# Elküldve: 2010. Feb. 05. 16:13 - Szerkesztve: charlie


Ha teljes képernyős double bufferinget akarsz, akkor saját Custom Screen-t kell nyitni, amihez plusz ScreenBitmapokat kell foglalni, és azok között váltogatni. Legalábbis az én kódom így csinálja, de már nem tudom honnét néztem ki pontosan, és lehet, hogy van jobb megoldás is. :)

Tehát ahhoz nem kell ablakot nyitni...

Demo programozáshoz rendszerbarát módon egyébkény úgy érdemes képernyőt nyitni, hogy nyitsz egy Custom Screent (OpenScreen()-nel), ezzel megoldod a Double Bufferinget meg mindent amit akarsz.

Aztán erre rányitsz egy teljes méretű Backdrop ablakot, fejléc meg minden egyéb nélkül, plusz úgy, hogy minden Message-t te kapj meg, ne legyen átméretezhető stb. Erre mindre vannak megfelelo IDCMP flagek, vagy Window Attributumok (WA_ flag). És akkor tetszés szerint rajzolhatsz doublebufferinggel, tetszés szerint kezelheted a bejövő egér és billentyűzet üzeneteket, mégis teljesen rendszerbarát vagy, mehet a multitask, meg minden.

De mondom, ha blittert és coppert akarsz programozni, akkor nem biztos, hogy ez a legjobb, de sw renderes demóhoz elég célravezető.

Plusz ha nextgenre is igényed van, akkor az AGA + C2P helyett elég egyszerű P96 vagy CGFX képernyőt nyitni, amibe chunkyban, vagy akár truecolorban is renderelhetsz. A message kezelés meg maradhat ugyanaz, mert compatible.

rachy
Tag

# Elküldve: 2010. Feb. 05. 18:12


Blittert es coppert is lehet sajat screenen izelgetni, csak nem tudom mennyi ertelme van. (Lehet a screen viewportba copper parancsokat fuzni, blitternek Graphics liben keresztul utasitasokat adni.)
De ha mar ennyire hardver kozelebe akarsz menni, akkor erdemesebb leallitani a rendszert (Exec/Disable vagy egy szoftveres exception, pl. TRAP utasitassal) es mindent kozvetlenul kezelni. Akkor biztos, hogy senki nem fog keresztbe tenni. Exec funkciok nagy resze igy is mukodik, lehet peldaul memoriat foglalni (csak minek ugye). Ebbol az allapotbol visszabillenteni a rendszert az eredeti kerekvagasba mar ravaszabb.

Travis
Tag
# Elküldve: 2010. Feb. 08. 12:08


Köszönöm, ennyi infóval megint el leszek egy ideig :-)

forum.amigaspirit.hu / Fejlesztés / Escape-re kilépés
 
 

Powered by discussion forum software miniBB™ © 2001-2019