Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2013
    Messaggi
    42

    [C++] Esecuzione in contemporanea di più istruzioni

    Ciao a tutti! Sto scrivendo un piccolo programma che tramite la pressione di una o più hotkey (stabilite dall'utente) riesce a riprodurre un suono dopo un certo intervallo di tempo (usando la Sleep()). Purtroppo il tutto accade sequenzialmente. Mi spiego meglio: date 2 hotkey "A" e "B" con "A" che riproduce un suono dopo 10 secondi e "B" dopo 15, se premo "A" e dopo 1 secondo "B" il programma aspetta prima 10 secondi per riprodurre il suono collegato ad "A" e poi ne aspetta altri 15 per riprodurre il suono collegato a "B". Io invece vorrei che il programma faccia partire contemporaneamente un tot di istruzioni (Sleep() e suono compresi) per ogni hotkey e riproducesse il suono esattamente dopo l'intervallo di tempo stabilito.

    Ho trovato le funzioni CancelWaitableTimer(), CreateWaitableTimer(), OpenWaitableTimer() e SetWaitableTimer(), ma non sono sicuro che possano fare ciò che desidero e anche se fosse non saprei come metterlo in pratica...

    Questa è la porzione di codice interessata:
    codice:
          RegisterHotKey(NULL, 1, 0, 'A');
          RegisterHotKey(NULL, 2, 0, 'B');
          RegisterHotKey(NULL, 3, 0, 'C');
          
          MSG msg={0};
          
          while(GetMessage(&msg, NULL, 0, 0) != 0) {
                          switch(msg.wParam) {
                                            case 1:UnregisterHotKey(NULL,1);
                                            Sleep(10000);
                                            PlaySound(TEXT("suonoA.wav"), NULL, SND_SYNC);
                                            RegisterHotKey(NULL, 1, 0, 'A');
                                            break;
                                            
                                            case 2:UnregisterHotKey(NULL,2);
                                            Sleep(15000);
                                            PlaySound(TEXT("suonoB.wav"), NULL, SND_SYNC);
                                            RegisterHotKey(NULL, 1, 0, 'B');
                                            break;
                                            
                                            case 3:goto fine;
                          }
          }
          
          fine:
          
          UnregisterHotKey(NULL,1);    
          UnregisterHotKey(NULL,2);   
          UnregisterHotKey(NULL,3);
    Qualcuno può aiutarmi? Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Dovresti usare più thread. Ma i due suoni li vorresti sentire insieme?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2013
    Messaggi
    42
    Non insieme, vorrei solo sentirli nell'ordine in cui ho premuto le hotkey.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Quote Originariamente inviata da kaine25 Visualizza il messaggio
    Non insieme, vorrei solo sentirli nell'ordine in cui ho premuto le hotkey.
    Allora ti basta avviare le Sleep in un thread per tasto.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2013
    Messaggi
    42
    Potresti farmi un esempio pratico veloce, per favore? Non ho molte nozioni sui thread...

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Mi dispiace ma non ne ho il tempo. E comunque avresti problemi dopo nell'uso se non studi quello che serve sui thread. Internet è piena di documentazione da cui studiare ed esempi su tutte le parti del trattamento dei thread...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2013
    Messaggi
    42
    EDIT: Ho risolto il problema del compilatore, ma adesso non riesco a capire come posso far funzionare i diversi case. Ho provato a raggruppare ogni case in una funzione, ma non fa nulla quando premo le hotkey (nei case ho scritto thread(funzione1);break; e thread(funzione2);break; ). Gli esempi che ho trovato sono tutti senza case e alla fine hanno un .join() che non capisco a cosa serva...
    Ultima modifica di kaine25; 05-05-2015 a 19:00

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2013
    Messaggi
    42
    Ok, ho risolto dichiarando ogni funzione come thread (es: thread t1(funzione)) e dopo ho usato il metodo detach() per permettere al thread di funzionare autonomamente fino alla fine. Risolto!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.