Buttons bei Beep ohne effekt



  • Hallo zusammen,
    ich habe ein kleines Tool geschrieben, bei dem man eine Frequenz eingeben kann.
    Dann soll für 3 sek z.B. der Ton über Beep(frequenz,3000) abgespielt werden.
    Leider scheint mir der Beep Befehl alles zu ignorieren, so kann ich z.B. trotz deaktivieren (ausgrauen) des Buttons drauf klicken und nach den3 sek kommt der nächste 3 sek Ton. Und wenn ich während eines Tones und deaktivierten buttons 10x klick dann kommt zehn mal der 3 sek ton. Kann mir einer sagen wieso...
    Vielen Dank schon mal.

    Gruß
    Andreas

    P.S. kann man hier eigentlich auch Anhänge machen?



  • Nur ne Vermutung:

    Ich nehme an, Du Beep()st innerhalb des ButtonClick-Handlers.
    Während des Beepens erfolgen dann keine Nachrichtenbehandlungen, die Applikation steht und ist reaktionslos, wie tot. Windows denkt dann, daß die Klicks noch schnell kamen, bevor der Button deaktiviert wurde.

    Was Du tun machen sollen würdest, wäre den Lautsprecher im Handler nur anzuschalten, und einen Timer zu starten, und bei Timerstop den Lautsprecher wieder auszuschalten. Leider unterstützt das die WinAPI nicht. Also Beep() reinschubsen in einen Background-Worker wohl?



  • Ok. Danke.
    Wie mach ich das denn am besten?
    Kann ich einen Button auch anders deaktivieren als mit:

    GetDlgItem(IDC_BUTTON_ABSPIELEN)->EnableWindow(FALSE);
    

    Gruß
    Andreas


  • Mod

    Nein! Das kann nicht sein.
    Wenn ein Button disbaled ist und dieser geklickt wird während er diabled ist wird das Event ignoriert.

    Das Problem liegt wahrscheinlich eher da dran, dass Deine Anwednung keinerlei Messages in den 3 Sekunden zulässt.

    Lagere das Tonabspielen in einen eigenen Thread uas.



  • Wie kann ich das tun und wie stell ich sicher das es erst weitergeht wenn der thread fertig ist?

    anbei mal der Code

    void CHzDlg::OnBnClickedButtonAbspielen()
    {
    	GetDlgItem(IDC_EDIT1)->SetFocus();
    	GetDlgItem(IDC_BUTTON_ABSPIELEN)->EnableWindow(FALSE);
    	UpdateData(TRUE);
    	HzBeep(m_iFreq, m_iTime*1000);
    	GetDlgItem(IDC_BUTTON_ABSPIELEN)->EnableWindow(TRUE);
    }
    
    void CHzDlg::HzBeep(int Frequenz, int TimeInSek)
    {
    	Beep(Frequenz,TimeInSek);
    }
    

    Die Funktion HzBeep hab ich gemacht um event. hier noch Dinge einzubauen.
    Kann mir jemand mit dem Thread helfen?



  • Kann mir jemand weiterhelfen?


  • Mod

    Enfach eine Funktion schreiben AfxBeginThread ausführen und dort den Ton abspielen lassen...



  • Also jetzt kann ich sofort wieder den Button Abspielen drücken und der Ton startet sofort neu. Und ich habe es nicht geschafft meine Parameter frequnez und time mit dem AfxBeginThread zu übergeben an HzBeep-Function.
    Kann mir jemand nochmal ne Hilfestellung geben?

    Gruß
    Andreas



  • die Daten kannst du doch in eine Struktur schreiben und diese über LPVOID pParam von AfxBeginThread an den tread übergeben. Bevor du deinen Tread startest deaktivierst du den Button und wenn der Thread abgelaufen ist, Sendest du eine Message damit der Button wieder aktiv wird



  • Hallo Andreas

    Du mußt einfach die WM_Message über die gedrückte Maustaste abfangen.
    Da diese wartet bis du aus dem "HzBeep()" raus bist, musst du sie danach aus der Warteschlange holen.

    void CBeepDlg::OnBeep() 
    {
    	MSG msg;
    
    	SetCursor(LoadCursor(NULL, IDC_WAIT));
    	GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
    
    	HzBeep(500,1000);
    
    	while (PeekMessage(&msg,NULL,WM_MOUSEFIRST,WM_MOUSELAST,PM_REMOVE) != 0) 
    	{
    	} 
    
    	GetDlgItem(IDC_BUTTON1)->EnableWindow(true);
    
    	// Cursor wieder normal
        SetCursor(LoadCursor(NULL, IDC_ARROW));
    }
    

  • Mod

    @Paul: Wenn schon eine Message-Loop, dann bitte eine, die ale Nachrichten behandelt... So ist auch nur halbgar.

    Die Thread-Methode ist mit sicherheit die einfachste...



  • Vielen Dank Paul hat so geklappt.
    😃

    Gruß
    Andreas


Anmelden zum Antworten