Zeitliche Verzögerung?



  • Hallo!
    Ich habe folgendes Problem: Ich spiele in meinem Programm eine mp3-datei ab und müsste zu bestimmten zeiten (also sagen wir z.b. wenn die mp3 bei 1:02,3 min ist) bestimmte aktionen durchführen. Das Auslesen der Zeiten ist überhaupt kein Problem, aber ich will das Porgramm eventl auch auf langsameren Rechnern nutzen, meint ihr das macht zeitliche Unterschiede? Wenn ja, kann ich diese irgendwie beheben?

    Danke schonmal

    MFG

    Hansi



  • Wie hast Du das denn bisher realisiert ? In Threads ? Dann konnteste Du ja die Interalle verringern in denen Du den Zeitwert prüfst oder ggf. mit Sleep/Events arbeiten. Mit welcher API gibst Du denn die Medien-Dateien wieder ?



  • Also ich hab das mit nem thread gemacht der eben dauerhaft abfragt wie weit die mp3 abgespielt ist. Ich gebe meine mp3 mit der MCI wieder. Also meinst du das jetz so, dass ich in den thread z.b. wenn ich jetz bei 1:02,3min bin und zum nächsten mak bei 1:05,7min abfragen muss, dass ich dann bei 1:02,3 nen sleep(3400) setze? Kann ich das sonst noch irgendwie verbessern? Gibt es schnellers als die MCI?

    MFG

    Hansi



  • Hi, ich hab en neues Problem und zwar kann ich vom Thread aus nicht die Abspielzeit abfragen...

    Hier mein Code:
    PlayMp3 sendet den Play Befehl an die MCI und Playposition sendet den Abfragebefehl und gibt die Abspielzeit auf dem BIldschirm aus.

    case ID_PLAY://Play Taste
    PlayMp3("C:\\Dokumente und Einstellungen\\4.wma");
    _beginthread(Thread2,0,NULL);//Hier wird der Thread aufgerufen
    PlayPosition(hWnd,hdc);
    break;
    case ID_V://Abfragen der Abspielzeit
    hdc=GetDC(hWnd);
    PlayPosition(hWnd,hdc);//Gibt die Abspielzeit auf dem Bildschirm aus
    ReleaseDC(hWnd,hdc);
    break;
    

    Thread:

    void Thread2(PVOID)
    {
    while(1)
    {
    HDC hdc2=GetDC(hWnd);
    PlayPosition(hWnd,hdc2);
    ReleaseDC(hWnd,hdc2);
    }
    }
    

    Das klappt auch alles richtig... Wenn ich auf play starte spielt er ab und auf ID_V gibt er die abspielzeit aus...
    Im Thread allerdings gibt er allerdings gar nichts aus... Kann ich aus dem Thread keine Sachen auf dem Bildschirm ausgeben?

    Danke

    MFG

    Hansi



  • Doch das sollte theoretisch möglich sein, die DC's werden auch intern synchronisiert, das sollte kein Problem sein 😉 .

    Wie und wo wird denn hier der DC initialisiert ?
    ➡

    Hansi schrieb:

    case ID_PLAY://Play Taste
    PlayMp3("C:\\Dokumente und Einstellungen\\4.wma");
    _beginthread(Thread2,0,NULL);//Hier wird der Thread aufgerufen
    PlayPosition(hWnd,hdc);
    break;
    


  • Ja, wenn ich das umänder gibt er mir wenn ich auf Play drücke auch die Abspielzeit aus. Aber im Thread funktioniert das immernoch net...

    Also normalerweise sollte er das in der Funktion PlayPosition auf den Bildschirm ausgeben:

    int PlayPosition(HWND hWnd, HDC hdc) 
    { 
    char cmd[500];
    char retval[500]; 
    DWORD retVal; 
    wsprintf(cmd,"status mp3player position"); 
    retVal=mciSendString(cmd, retval, 500, NULL); 
    ms=atoi(retval); 
    sek=ms/1000;  
    ms=ms-sek*1000;
    min=sek/60;          
    hours=min/60;       
    sek2=sek-(hours*60)-(min*60);    
        wsprintf(cmd,"%i:%i:%i,%i",hours,min,sek2,ms); 
       SetWindowText(hWnd,cmd); 
    TextOut(hdc,1,1,cmd,10);
        return 0; 
    }
    

    Kann das dadran irgendwie liegen? Kann ich das irgendwie umändern, dass es klappt?

    Danke

    MFG

    Hansi



  • Also ich habs jetzt behoben, idem ich jetzt alles direkt im Thread mache:

    void Thread2(PVOID)
    {
    //Wiedergabe starten	
    char cmd[500]; 
    wsprintf(cmd,"open \"%s\" alias mp3player","C:\\Dokumente...\\4.wma"); 
        mciSendString(cmd,NULL,NULL,NULL);
        wsprintf(cmd,"set mp3player time format milliseconds"); 
      mciSendString(cmd,NULL,NULL,NULL);
        wsprintf(cmd,"play mp3player","C:\\Dokumente...\\4.wma");
        mciSendString(cmd,NULL,NULL,NULL);			 
        DWORD retVal; 
        char retval[500]; 
    while(1)
    {
    HDC hdc2=GetDC(hWnd);
    char cmd[500];
    char retval[500]; 
    DWORD retVal; 
    wsprintf(cmd,"status mp3player position"); 
    retVal=mciSendString(cmd, retval, 500, NULL); 
    ms=atoi(retval); 
    sek=ms/1000;  
    ms=ms-sek*1000;
    min=sek/60;         
    hours=min/60;       
    sek2=sek-(hours*60)-(min*60);
    wsprintf(cmd,"%i:%i:%i,%i",hours,min,sek2,ms); 
    SetWindowText(hWnd,cmd); 
    TextOut(hdc2,1,1,cmd,10);
    ReleaseDC(hWnd,hdc2);
    }
    }
    

    Scheinbar hats dadran gelegen, dass der hWnd-Parameter an die Funktion Playposition net richtig übermittelt wurde... Weil wenn ich ne MessageBox hab ausgeben lassen, wurde die im Fenster gar net angezeigt...
    Dadurch, dass ich das jetz in den Thread umgelegt hab lädt es jetz zwar länger, aber hauptsache es läuft;) Also nochma danke für die HIlfe, bin jetzt echt sau happy 😃

    MFG

    Hansi


Anmelden zum Antworten