Keine Windows Nachrichten während download



  • Ich benutze URLDownloadToFile() um Dateie herunter zu laden, dazu habe ich noch eine IBindStatusCallback classe, wordurch ich den download beobachten kann. Damit es bei größeren Dateien nichtlangweilig wird und man nicht denkt das das programm abgeschmiert sei, habe ich noch eine Progress bar eingebaut! Der download läuft einand frei, die Progress bar läuft auch super. Leider schint es so als ob ich einfach keine windows nachrichten empfange, wenn der download an ist! Die maus wird zu dieser Sanduhr und ich kann nichts mehr anklicken! Kennt vieleicht jemand das problem und weiß wie ich dies lösen könnte?


  • Mod

    Windowsnachrichten werden nur empfangen, wenn auch Deine Message Loop läuft.
    Du benötigst einen Workrthread!



  • Was meinst du mit Workthread? Soll ich die Message loop in nen Thread packen, oder wie kann ich das verstehen?



  • Du mußt einen extra Thread starten der nur den Download behandelt.



  • Wenn ich URLDownloadToFile() benutze, wird der Download doch an die DLL weiter gegeben und ich kann dort doch nichts mehr verändern.



  • was is los? dll hat nix mit threads zu tun. ➡



  • Meine Klasse für den Download sieht folgendr maßen aus:

    class DownloadStatus : public IBindStatusCallback
    {
    public:
    
    STDMETHODIMP QueryInterface(REFIID riid ,void ** ppv){ return E_NOINTERFACE;}
    STDMETHODIMP_(ULONG) AddRef(){ return 0; }
    STDMETHODIMP_(ULONG) Release(){ return 0;}
    STDMETHODIMP OnStartBinding(DWORD grfBSCOption, IBinding* pbinding){ return 0; }
    STDMETHODIMP GetPriority(LONG* pnPriority){ return 0; }
    STDMETHODIMP OnLowResource(DWORD dwReserved){ return 0; }
    STDMETHOD(OnProgress) (ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
    {
    
    	SendMessage(hProgress,PBM_SETRANGE32,0,ulProgressMax);
    
    	SendM
    essage(hProgress,PBM_SETPOS,ulProgress,ulProgressMax);
    sprintf(text, "%.2fMb of %.2fMb\r", ((float)ulProgress / (1024*1024)), ((float)ulProgressMax / (1024*1024)));
    //MessageBox(hWnd, (LPCSTR)szStatusText, "hi", NULL);
    return 0;
    }
    STDMETHODIMP OnStopBinding(HRESULT hrResult, LPCWSTR szError){ return 0; }
    STDMETHODIMP GetBindInfo(DWORD* pgrfBINDF, BINDINFO* pbindinfo){ return 0; }
    STDMETHODIMP OnDataAvailable(DWORD grfBSCF, DWORD dwSize, FORMATETC *pfmtetc,STGMEDIUM* pstgmed){ return 0; }
    STDMETHODIMP OnObjectAvailable(REFIID riid, IUnknown* punk){ return 0; }
    private:
    	char text[10000];
    	bool bDone;
    };
    

    Meine Progress bar erstelle ich so:

    hProgress = CreateWindowEx(0, PROGRESS_CLASS, NULL,
    		               WS_CHILD | WS_VISIBLE| PBS_SMOOTH,
    			      10, 20, 680, 17,
    			      hWnd, NULL, hInstance, NULL);
    

    Und den Download rufe ich so auf:

    DownloadStatus cProgress;
    	HRESULT hResult = URLDownloadToFile(NULL, "http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-5.0.67-win32.zip/from/http://sunsite.informatik.rwth-aachen.de/mysql/", "haha2.exe", NULL, &cProgress);
    

    Ich Frag mich worauf ich dort einen Thread anwenden soll?



  • AND | OR schrieb:

    Du mußt einen extra Thread starten der nur den Download behandelt.

    http://msdn.microsoft.com/en-us/library/ms684841(VS.85).aspx



  • DWORD WINAPI DLThread() 
    { 
    	DownloadStatus cProgress;
    	HRESULT hResult = URLDownloadToFile(NULL, "...", "...", NULL, &cProgress);
    	return 0;
    }
    

    Dankeschön! Mir fällt gra ein das Funktionen die in einer Funtion sind ja auch von dem Thread betroffen sind xD



  • Alternativ kannst du auch in der Callback Methode von UrlDownloadToFile deine Nachrichtenschleife abarbeiten.


Anmelden zum Antworten