![]() |
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: 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. |
![]() |