multithreading - ¿Actualizar TWebBrowser en un hilo separado?
delphi delphi-2007 (1)
Cuando la instrucción if se ejecuta y llama a WaitWhileProcessing para evaluar la condición, se repite 100 veces con un décimo de segundo de suspensión. Pero, ¿qué mensajes están esperando al llamar a ProcessMessages? ¿Podría llamarse el método de nuevo recursivamente? Nunca llegará a la suspensión, pero sigue invocando este método. Por cierto, tenga en cuenta que ProcessMessages es una mala práctica, pero por ahora ... intente esto:
var
isWaitWhileProcessingBusy :boolean = false;
function TMapItemCollection.WaitWhileProcessing: Boolean;
var
vSleepCnt: Integer;
begin
if not isWaitWhileProcessingBusy then
begin
isWaitWhileProcessingBusy = true;
vSleepCnt := 0;
while Processing or Loading or vSleepCnt < 100 do
begin
inc(vSleepCnt);
Application.ProcessMessages;
Sleep(100);
end;
isWaitWhileProcessingBusy := false;
end;
Result = Processing or Loading;
end;
Como pueden ver, también cambié algunas otras cosas menores. La ruptura no está en el estado de tiempo y el resultado es simplemente el resultado de Procesamiento o Carga (porque esa expresión da el resultado real). El extra isWaitWhileProcessingBusy fuera de la función evita que el bucle de mensaje vuelva a entrar. Con suerte eso evitará bloquear la interfaz de usuario. Esto tampoco es una buena práctica, pero por ahora podría ayudar a resolverlo y con ello identificar el problema.
¿Hay alguna razón por la que sondeas Cargando / Procesando? ¿No sería mucho más fácil utilizar el evento OnDocumentComplete de TWebBrowser?
... y otro pensamiento cruzó por mi mente ... ¿Has revisado el administrador de tareas? google maps usa flash, un componente activex que también usa el subproceso UI principal. Esto también podría ser el cerdo de recursos que causa la inanición.
¡Buena suerte!
Uso un TWebBrowser para mostrar un mapa de Google. El problema es que bloquea el hilo principal ui mientras carga el mapa. ¿Es posible actualizar el mapa en un hilo separado?
Editar: RRUZ tiene razón. TWebBrowser tiene carga asíncrona para la URL. Pero encontré el problema de por qué bloquea The call:
if WaitWhileProcessing and (MapQueryResult.Count > 0) then
Result := MapQueryResult[0] as TMapQuery;
y el método:
function TMapItemCollection.WaitWhileProcessing: Boolean;
var
vMaxSleepCnt: Integer;
begin
Result := True;
vMaxSleepCnt := 0;
while Processing or Loading do
begin
inc(vMaxSleepCnt);
Application.ProcessMessages;
Sleep(100);
if vMaxSleepCnt = 100 then
begin
Result := False;
Break;
end;
end;
end;
Por lo que parece solucionar esto, el código debe ser refactorizado. Pero este no es el alcance de esta pregunta.