Переполнение буфера клавиатуры

Тема в разделе "Delphi - Система", создана пользователем APTEM, 30 апр 2004.

Статус темы:
Закрыта.
  1. APTEM

    APTEM Гость

    Простейшая музыкальная программа. Проблема в том, что при долгом нажатии на клавишу (музыка активируется при нажатии на z,x,c,v,b,n) звук ведет себя очень странно. Кажется переполнение буфера клавиатуры. Как можно решить эту проблему?

    uses crt,graph;

    var ch:char;
    i,j:integer;
    ch1: byte;

    procedure Sound(cc: byte; i:integer;F:single);
    var k:word;
    c:byte;
    begin
    k:=round(1.193e6/f);
    port[$43]:=$be;
    port[$42]:=lo(k);
    port[$42]:=hi(k);

    setfillstyle(1,12);
    bar(i*50,100,(i+1)*50-5,300);

    c:=port[$61];
    port[$61]:=c or 3;
    repeat until (port[$60]<>cc);
    port[$61]:=c and (not 3);

    setfillstyle(1,i);
    bar(i*50,100,(i+1)*50-5,300);

    end;

    begin

    i:=detect;
    initgraph(i,j,'d:\tp7');{pri zapisi na disk C:\ zamenit d:\tp7 na c:\tp7}

    for i:=1 to 7 do
    begin
    setfillstyle(1,i);
    bar(i*50,100,(i+1)*50-5,300);
    end;

    repeat
    ch1:=port[$60];
    (* writeln(port[$60]);*)
    case ch1 of
    (44):sound(ch1,1,440);
    (45):sound(ch1,2,460);
    (46):sound(ch1,3,490);
    (47):sound(ch1,4,530);
    (48):sound(ch1,5,590);
    (49):sound(ch1,6,650);
    (50):sound(ch1,7,720);

    end;
    until ch1=27;

    closegraph;
    end.
     
  2. admin

    admin Well-Known Member

    Регистрация:
    8 авг 2003
    Сообщения:
    2.811
    Симпатии:
    0
    APTEM
    нормально
    а почему странно? звучит главное :blink:
     
  3. Guest

    Guest Гость

    Серёга
    При длинном нажатии звучит уже не нормально. Или при нажатии на кнопки более 15 раз звучит тоже ненормально. В этом все и дело.
     
  4. admin

    admin Well-Known Member

    Регистрация:
    8 авг 2003
    Сообщения:
    2.811
    Симпатии:
    0
    Guest
    ну да
    переполнение
    как решить хз. знаю что даже МС не решило её в досе. попробуй запусти цикл и подержи та клавишу, всё станет понятно. даже повесить можно комп.
     
  5. saver

    saver Гость

    Тебе просто надо очищать буффер... Вот посмотри..., тут почти вся твоя прога, я только добавил одну процедуру и вызвал её в цикле твоей...

    Program FortePiano;
    Uses Crt, Graph;
    Var GraphDriver, GraphMode: Integer;
    Ch: Byte; i: Integer;

    Procedure FreeKeyBoardBuffer;
    Var Ch: Char;
    Begin
    While KeyPressed Do Begin
    ch:=ReadKey;
    End;
    End;

    Procedure Sound(Key: Byte; i: Integer; f:real);
    Var k: Word;
    c: Byte;
    Begin
    k:=Round(1.193e6/f);
    port[$43]:=$be;
    port[$42]:=lo(k);
    port[$42]:=hi(k);

    SetFillStyle(1, 12);
    Bar(i*50, 100, (i+1)*50-5, 300);
    c:=port[$61];
    port[$61]:=c Or 3;

    Repeat FreeKeyBoardBuffer Until port[$60]<>Key;
    port[$61]:=c And (Not 3);
    SetFillStyle(1, i);
    Bar(i*50, 100, (i+1)*50-5, 300);
    end;

    Begin
    GraphDriver:=Detect;
    InitGraph(GraphDriver, GraphMode, 'C:\bp\Bgi');

    For i:=1 To 7 Do Begin
    SetFillStyle(1, i);
    Bar(i*50, 100, (i+1)*50-5, 300);
    End;

    Repeat
    Ch:=port[$60];
    (* writeln(port[$60]);*)
    Case Ch Of
    44:sound(Ch,1,440);
    45:sound(Ch,2,460);
    46:sound(Ch,3,490);
    47:sound(Ch,4,530);
    48:sound(Ch,5,590);
    49:sound(Ch,6,650);
    50:sound(Ch,7,720);
    End;
    Until Ch=27;
    CloseGraph;
    End.

    ... вот и все проблемы. :)
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей