amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > MSGPort richtig benutzen [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2006-09-24, 22:23 h

MaikG
Posts: 5172
User
Wie benutzt man den MSGPort richtig? Wollte das der Voice.library
per Multitasking läuft. Aber wenn ich das mit dem MSGPort wie bei
einem Fenster mache geht das nicht.
In den Voice Autodocs steht irgendwas mit im_Class die gibts
aber nirgend in den Includes.

code:
'$include voice.bc
'$include exec.bh
'$include dos.bh
'$INCLUDE Intuition.bh

LIBRARY "voice.library"
LIBRARY OPEN "exec.library"
LIBRARY OPEN "dos.library"
LIBRARY OPEN "intuition.library", 36

DECLARE SUB PickSampler& LIBRARY
DECLARE FUNCTION AddVoiceTask& LIBRARY
DECLARE FUNCTION RemVoiceTask& LIBRARY

DEFINT a-z

max_num&=12
PickSampler(GENERIC&)

MapBuffer& = AllocMem&(FREQ_MAP_SIZE&*max_num&, MEMF_PUBLIC&)
IF MapBuffer& THEN
 fh& = xOpen&(SADD("DTMF" + CHR$(0)), MODE_OLDFILE&)
 junk& = xRead&(fh&,MapBuffer&,FREQ_MAP_SIZE&*max_num&)
 junk& = xClose&(fh&)
ELSE
 PRINT "NOMEM":END
END IF


Voiceport& = CreateMsgPort&()
IF voiceport& THEN
junk&=AddVoiceTask&(MapBuffer&,voiceport&,max_num&,HIGH_RES&)
DO
 imsgV& = GetMsg&(PEEKL(Voiceport&+UserPort%))
 IF imsgV&<>0 THEN 
  imsgCodeV% =PEEKW(imsgV&+IntuiMessageCode%)
  ReplyMsg imsgV&
  PRINT "code:";imsgCodeV%
 END IF
IF INKEY$=CHR$(27) THEN GOTO 100
LOOP

100 junk&=RemVoiceTask&()
DeleteMsgPort Voiceport&
Freemem MapBuffer&, FREQ_MAP_SIZE&*max_num&
END IF


[ - Answer - Quote - Direct link - ]

2006-09-24, 22:40 h

DariusBrewka
Posts: 899
[Banned user]
im_Class ist ein Member der intuition/IntuiMessage, d.h. wenn im_Class=0 ist wurde die Message von der VOICE library abgesendet.

Leider habe ich mit Basic seit ca. 88 nicht wirklich mehr etwas gemacht, aber

code:
GetMsg&(PEEKL(Voiceport&+UserPort%))


ist für mich etwas merkwürdig, siehrt für mich nach soetwas aus wie

code:
GetMsg&(PEEKL(window&+UserPort%))


da GetMsg() als Parameter einen MessagePort erwartet, den aber CreateMsgPort() schon liefert, warum wird dann UserPort, was garnichts mit der voice.library zu tun hat dazuaddiert?
Bzw. du tust so, als ob CreatemsgPort() eine Windows struktur zurück gibt.

eher Richtig wäre sowas in der Art

code:
GetMsg&(VoicePort&)


[ Dieser Beitrag wurde von DariusBrewka am 24.09.2006 um 22:41 Uhr geändert. ]

[ Dieser Beitrag wurde von DariusBrewka am 24.09.2006 um 22:43 Uhr geändert. ]

[ - Answer - Quote - Direct link - ]

2006-09-25, 13:12 h

MaikG
Posts: 5172
User
Danke! Geht jetzt.

[ - Answer - Quote - Direct link - ]

2006-09-25, 16:57 h

thomas
Posts: 7721
User
Zitat:
Original von MaikG:
Danke! Geht jetzt.


Du hast da aber einen Busy-Loop drin. Du solltest irgendwo noch ein Wait() einbauen, sonst braucht dein Programm 100% CPU und alle anderen kriegen nicht mehr viel ab.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Answer - Quote - Direct link - ]

2006-09-25, 17:54 h

MaikG
Posts: 5172
User
mh, stimmt. So?

junk&= xWait&(1& << PEEKB(VoicePort&)+mp_SigBit%))

[ - Answer - Quote - Direct link - ]

2006-09-25, 18:49 h

thomas
Posts: 7721
User
@MaikG:

Wenn du die Klammer vor dem + wegmachst, funktioniert's auch.

Allerdings würde ich Wait nur benutzen, wenn ich auch auf mehrere Signale warten möchte. Um auf genau einen Port zu warten, reicht WaitPort.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Answer - Quote - Direct link - ]

2006-09-25, 22:51 h

MaikG
Posts: 5172
User
Mh, das Programm muss allerdings weitergehen weil ich auch
noch auf einen Tastaturabbruch und einen abbruch nach einer
gewissen Zeit testen muss.

[ - Answer - Quote - Direct link - ]

2006-09-25, 23:05 h

DariusBrewka
Posts: 899
[Banned user]
Dann versuche wenigstens die Tastaturabfrage mittels Intuition oder input.device wenn beides nicht geht lege den Task wenigstens kurzzeitig in den Schlaf, indem du ein kleines Delay() einfügst.

[ - Answer - Quote - Direct link - ]

2006-09-26, 09:23 h

MaikG
Posts: 5172
User
>Dann versuche wenigstens die Tastaturabfrage mittels Intuition oder
>input.device wenn beides nicht geht lege den Task wenigstens
>kurzzeitig in den Schlaf, indem du ein kleines Delay() einfügst.

Die Tastaturabfrage könnte ich schon über Intuition machen,
aber nicht wieviel Zeit vergangen ist, nehme ich an.
Ja, dann werd ich mal Delay nehmen.

[ - Answer - Quote - Direct link - ]

2006-09-26, 10:14 h

DariusBrewka
Posts: 899
[Banned user]
Delay() ist zwar auch keine wirkliche Lösung, aber damit kannst du zumindestens erreichen, daß die Tastatur nicht 100000/s abgefragt wird war garnicht nötig ist und damit mehr Zeit für's Multitasking übrig bleibt. Ein Delay(5) sorgt dafür das der Task für 100ms schlafen gelegt wird, damit hast du eine abfragefolge von 10/s, das reicht doch und andere Tasks haben etwas Rechenzeit.

am Besten:

Für das andere gibt's das Timerdevice, d.h. Tastaturabfrage über Intuition abbruch nach einer gewissen Zeit über das Timerdevice.

[ Dieser Beitrag wurde von DariusBrewka am 26.09.2006 um 10:16 Uhr geändert. ]

[ - Answer - Quote - Direct link - ]

2006-09-26, 18:15 h

MaikG
Posts: 5172
User
>am Besten:

>Für das andere gibt's das Timerdevice, d.h. Tastaturabfrage über
>Intuition abbruch nach einer gewissen Zeit über das Timerdevice.

Mh, okay wenn ich zeit habe werde ich auch die bessere Lösung
versuchen aber erstmal tuts Delay.

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > MSGPort richtig benutzen [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2025 by amiga-news.de - all rights reserved.
.