amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > MSGPort richtig benutzen [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

24.09.2006, 22:23 Uhr

MaikG
Posts: 5172
Nutzer
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


[ - Antworten - Zitieren - Direktlink - ]

24.09.2006, 22:40 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
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. ]

[ - Antworten - Zitieren - Direktlink - ]

25.09.2006, 13:12 Uhr

MaikG
Posts: 5172
Nutzer
Danke! Geht jetzt.

[ - Antworten - Zitieren - Direktlink - ]

25.09.2006, 16:57 Uhr

thomas
Posts: 7716
Nutzer
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/

[ - Antworten - Zitieren - Direktlink - ]

25.09.2006, 17:54 Uhr

MaikG
Posts: 5172
Nutzer
mh, stimmt. So?

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

[ - Antworten - Zitieren - Direktlink - ]

25.09.2006, 18:49 Uhr

thomas
Posts: 7716
Nutzer
@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/

[ - Antworten - Zitieren - Direktlink - ]

25.09.2006, 22:51 Uhr

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

[ - Antworten - Zitieren - Direktlink - ]

25.09.2006, 23:05 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
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.

[ - Antworten - Zitieren - Direktlink - ]

26.09.2006, 09:23 Uhr

MaikG
Posts: 5172
Nutzer
>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.

[ - Antworten - Zitieren - Direktlink - ]

26.09.2006, 10:14 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
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. ]

[ - Antworten - Zitieren - Direktlink - ]

26.09.2006, 18:15 Uhr

MaikG
Posts: 5172
Nutzer
>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.

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > MSGPort richtig benutzen [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.