Thread-Problem



  • Wie kann ich die Funktion mciSendString() in einem Thread benutzen?
    Problem:

    wsprintf(cmd,"status Player position");
    	retVal=mciSendString(cmd, retval, 500, NULL);
    

    retval ist immer 0, müsste aber millisekunden enthalten,
    funktioniert alles korrekt wenn ich es direkt starte,
    im thread aber nicht!

    Bitte um lösung des Problems



  • deine vermutung ist nicht richtig:

    Return Values

    Returns zero if successful or an error otherwise. The low-order word of the returned DWORD value contains the error return value. If the error is device-specific, the high-order word of the return value is the driver identifier; otherwise, the high-order word is zero. For a list of possible error values, see MCIERR Return Values.

    To retrieve a text description of mciSendString return values, pass the return value to the mciGetErrorString function.



  • ich meine den 2.parameter
    der muss die millisekunden enthalten!



  • aso
    🙂

    zeig mal den completten code



  • Hier den Quellcode:

    void CXLinuxDlg::OnBnClickedButton4()
    {
    
        CWinThread* pThread = AfxBeginThread(getpos3,this,THREAD_PRIORITY_NORMAL);
    
    }
    
    UINT CXLinuxDlg::getpos3(LPVOID pParam)
    {
    	CDialog* pDlg = (CDialog*)pParam;
    	char cmd[500];
        char retval[500];
        DWORD retVal;
        int ms;
        int sek, sek2;
        int min, min2;
        int hours;
    
    	while(1){
        // Position in Milisekunden holen:
            wsprintf(cmd,"status Player position");
    		retVal=mciSendString(cmd, retval, 500, NULL);
            if (retVal!=0)
            {
                // Hat nicht geklappt!
                pDlg->SetWindowText("Unable to get position");
    
            }
    
        // Ein bisschen rumrechnen:
        ms=atoi(retval);    // Position in Millisekunden
        sek=ms/1000;        // Milisekunden umgerechnet in Sekunden
        min=sek/60;         // Die Sekunden umgerechnet in Minuten
        hours=min/60;       // Die Minuten umgerechnet in Stunden
        sek2=sek-(hours*60)-(min*60);   // Sekunden darf nicht größer als 60 sein..
    
        // Das Ganze ins Stunden:Minuten:Sekunden Format bringen und in die Titelzeile schreiben:
        wsprintf(cmd,"%00i:%00i:%00i",hours,min,sek2);
        pDlg->SetWindowText(cmd);
    	}
    	return 0;
    }
    


  • Was bekommst du denn für einen Rückgabewert?

    und kleiner tipp:
    sek2=sek-(hours*60)-(min*60);

    stimmt nicht ganz 😉



  • Die Millisekunden, die es schon läuft



  • was zeigt dir denn folgendes an?

    retVal=mciSendString(cmd, retval, 500, NULL);
    MessageBox(0, retval, retval, 0);
    


  • retVal! retVal! retVal! retVal! retVal!

    Return Values
    Returns zero if successful or an error otherwise. The low-order word of the returned DWORD value contains the error return value. If the error is device-specific, the high-order word of the return value is the driver identifier; otherwise, the high-order word is zero. For a list of possible error values, see MCIERR Return Values.

    Ist sowieso eine schlechte Idee, den Rückgabewert (retVal) wie den returnString zu nennen. Siehst ja, was dabei für Mißverständnisse aufkommen 😉


Anmelden zum Antworten