![]() |
URLDownloadToFile Dialog hängt.
Kleines Problem.
![]() Meine Frage ist wie oft wird die Callback aufgerufen? Denn mein Dialog hängt kann ihn nicht bedienen trotz WinprocessMessages..
Delphi-Quellcode:
function TBindStatusCallback.OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG;
szStatusText: LPCWSTR): HResult; var szST: string; begin if FTimeouCheck then begin if GetCurrentTime > FTimeoutValue then begin Result := E_ABORT; szST := 'TimeOut.. no TMDB_backdrop is loaded'; SendMessage(GetDlgItem(hDlg, ID_DOWNLOADTEXT), WM_SETTEXT, 0, LONG_PTR(szST)); Sleep(3000); SendMessage(hDlg, WM_CLOSE, 0, 0); hDlg := 0; Exit; end; end; case ulStatusCode of BINDSTATUS_CONNECTING: begin szST := 'Connected to Server ' + szStatusText; SendMessage(GetDlgItem(hDlg, ID_DLG_INFOSTATUS), WM_SETTEXT, 0, LONG_PTR(szST)); if(FUserCancel) then begin Result := E_ABORT; exit; end; end; BINDSTATUS_BEGINDOWNLOADDATA: begin // reset progressbar ******* hier inkrementiere ich die Value weil BINDSTATUS_DOWNLOADINGDATA nie aufgerufen wird. inc(Value, 50); ProgressBar.Value := Value; SKAERO_InvalidateRect(ProgressBar.Handle, false); // show current action case Value of 50: szST := 'Downloading TMDB_backdrop'; 100: szST := 'Downloading TMD_Poster'; end; SendMessage(GetDlgItem(hDlg, ID_DOWNLOADTEXT), WM_SETTEXT, 0, LONG_PTR(szST)); // download exit by the user? if(FUserCancel) then begin Result := E_ABORT; exit; end; end; BINDSTATUS_DOWNLOADINGDATA: begin // update progress SendMessage(GetDlgItem(hDlg, ID_PROGRESS), PBM_SETPOS, MulDiv(ulProgress, 100, ulProgressMax), 0); // download exit by the user? if(FUserCancel) then begin Result := E_ABORT; exit; end; end; BINDSTATUS_ENDDOWNLOADDATA: begin if Value = 100 then begin SendMessage(hDlg, WM_CLOSE, 0, 0); hDlg := 0; end; end; end; // message pump WinProcessMessages; Result := S_OK; end;
Delphi-Quellcode:
BINDSTATUS_DOWNLOADINGDATA wird auch niemals aufgerufen.
procedure WinProcessMessages;
var ProcMsg: TMsg; begin while PeekMessage(ProcMsg, 0, 0, 0, PM_REMOVE) do begin if (ProcMsg.message = WM_QUIT) then Exit; TranslateMessage(ProcMsg); DispatchMessage(ProcMsg); end; end; FUserCancel kann ich auch nicht bedienen weil der Dialog hängt. Gib es da keine bessere Alternative um 2 Images zu laden ? gruss |
AW: URLDownloadToFile Dialog hängt.
Ich kenne mich in dem Bereich jetzt nicht wirklich aus, deine Botschaftenschleife sieht aber etwas komisch/verdächtig aus:
1. Du benutzt PeekMessage statt GetMessage. Dadurch pollst du dauernd statt einfach nur aufgeweckt zu werden wenn eine neue Message da ist 2. Die If Abfrage für WM_QUIT wäre zumindest bei einer GetMessage basierten Lösung m.W. überflüssig. Da würde man nur while Getmessage do schreiben. Grüße TubroMagic |
AW: URLDownloadToFile Dialog hängt.
Zitat:
Nun denn. Danke. Sorry.. Hilft mir nicht wirklich weiter. Schau mal was Application.ProcessMessages; denn so macht. Ich könnte es auch so auslegen ändert aber nichts daran das mein Dialog hängt.
Delphi-Quellcode:
Der einzige unterschied ist hier das ich mir
if(PeekMessage(msg, hDlg, 0, 0,PM_REMOVE)) then
IsDialogMessage(hDlg, msg);
Delphi-Quellcode:
sparen kann.
TranslateMessage(ProcMsg);
DispatchMessage(ProcMsg); Zitat:
Das ich WM_QUIT mit behandle ist für mich so in Ordnung zur Sicherheit. PS: Nur zu deiner Information!
Delphi-Quellcode:
gruss
[SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode=True)]
function TApplication.ProcessMessage(var Msg: TMsg): Boolean; var Handled: Boolean; Unicode: Boolean; MsgExists: Boolean; begin Result := False; MsgExists := PeekMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE); if MsgExists or PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE) then begin Unicode := (Msg.hwnd = 0) or IsWindowUnicode(Msg.hwnd); if not MsgExists then begin if Unicode then MsgExists := PeekMessageW(Msg, 0, 0, 0, PM_REMOVE) else MsgExists := PeekMessageA(Msg, 0, 0, 0, PM_REMOVE); end; if MsgExists then begin Result := True; if Msg.Message <> WM_QUIT then begin Handled := False; if Assigned(FOnMessage) then FOnMessage(Msg, Handled); if not IsPreProcessMessage(Msg) and not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then begin TranslateMessage(Msg); if Unicode then DispatchMessageW(Msg) else DispatchMessageA(Msg); end; end else begin {$IF DEFINED(CLR)} if Assigned(FOnShutDown) then FOnShutDown(self); DoneApplication; {$IFEND} FTerminate := True; end; end; end; end; |
AW: URLDownloadToFile Dialog hängt.
Der Unterschied zwischen VCL's Process Message und deiner ist, dass die von Delphi nur dann greift,
wenn dein Programm gerade nichts zu tun hat. Deine läuft in einem Eventhandler immer und solange, bis deine Anwendung beendet wird. SOweit ich weiß, sollte in einem Eventhandler jedoch keine Nachrichtenbearbeitung erfolgen, da diese mitunter Reetranz Probleme verursachen kann. z. B. im Kontext der ICS Socket Komponenten wird soweit ich mich erinnere immer empfohlen, bloß nicht Application.ProcessMessages oder ähnliches innerhalb des Handlers aufzurufen. Das kann zum erneuten Aufruf des Handlers für die selbe Nachricht führen (ich fragte mich zwa schon immer wieso, weil die Nachricht doch zu dem Zeitpunkt eigentlich schon aus der Warteschlange raus sein sollte, aber es scheint tatsächlich zu Problemen zu führen). |
AW: URLDownloadToFile Dialog hängt.
Zitat:
Sie läuft nur solange wie meine Callback aktiv ist und wird auch nur dann aufgerufen. Und sie soll sicherstellen das andere Messagen weiterhin verarbeitet werden können. Was nicht in der Callback funktioniert da diese in zu unterschiedlichen Intervallen aufgerufen wird. Es ist nicht GetMessage sondern PeekMessage. Im ersten bei GetMessage würde ich dir recht geben diese Queue läuft bis die Anwendung beendet ist. Zitat:
Das Problem ist die Callback das sie nicht kontinuierlich aufgerufen wird sondern nur nach einer bestimmten zeit. Deshalb bekomme ich keinen zugriff auf meinen Dialog. Zitat:
Ich habe es jetzt erstmal so gelöst ändert nichts daran das der Dialog hängt und ich keine Eingaben über den Button tätigen kann aber so wird der Dialog zumindest geschlossen wenn das TIMEOUT abgelaufen ist.
Delphi-Quellcode:
gruss
BindStatusCallback := TBindStatusCallback.Create;
BindStatusCallback.FTimeouCheck := True; BindStatusCallback.FTimeoutValue := GetCurrentTime + TIMEOUT; Status := URLDownloadToFileW(nil, Url, FBackdroppath, 0, BindStatusCallback); //… callback if FTimeouCheck then begin if GetCurrentTime > FTimeoutValue then begin Result := E_ABORT; szST := 'TimeOut.. no TMDB_backdrop is loaded'; SendMessage(GetDlgItem(hDlg, ID_DOWNLOADTEXT), WM_SETTEXT, 0, LONG_PTR(szST)); Sleep(3000); SendMessage(hDlg, WM_CLOSE, 0, 0); hDlg := 0; Exit; end; end; |
AW: URLDownloadToFile Dialog hängt.
Da "man" eh Alles besser weiß, kennt "man" auch den Unterschied zwischen SendMessage und PostMessage, gell?
Warum schreibt "man" nicht endlich in die Signatur, dass "man" non-VCL bevorzugt? :duck::glaskugel: Gibbets hier kein Popcorn-Smiley :pale:? SCNR ![]() Sorry, falscher Link, meinte den hier: ![]() |
AW: URLDownloadToFile Dialog hängt.
Zitat:
Wenn dem so wäre müsste ich hier nichts fragen aber Danke für die Blumen. Zitat:
Zitat:
Zitat:
Möchtest du jetzt über mich herziehen oder hast du vielleicht auch eine funktionierende Lösung anzubieten? Du must aber nicht meinen das durch Postmessage die Callback eher aufgerufen wird. Wenn der Server der an gepinkt wurde keine Rückantwort sendet dann kannst du lange warten bis die Callback aufgerufen wird. Und das sorgt dann dafür das mein Dialog hängt. Aber habe eine Lösung oben gepostet mit Timeout das reicht mir erstmal. gruss |
AW: URLDownloadToFile Dialog hängt.
SendMessage wartet (d.h. blockiert) so lange, biss die Nachricht auf der Gegenseite (wer immer das auch ist) bearbeitet wurde.
PostMessage schickt die Nachricht los und kehrt gleich zurück. Wenn ich's richtig gesehen habe hast du dieses Muster in deinem Code: SendMessage Sleep Sendmessage Keine Ahnung ob das wirklich die Ursache ist,aber das sieht zumindest auf einen oberflächlichen Blick so aus, als ob da eigentlich PostMessage hin gehört. |
AW: URLDownloadToFile Dialog hängt.
Zitat:
Zitat:
gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz