2012-03-01 26 views
21

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?¿Desea actualizar TWebBrowser en un hilo separado?

Editar: RRUZ tiene usted razón TWebBrowser tiene carga asíncrona para la URL. pero he encontrado el problema de por qué se bloquea la llamada:

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 a solucionar este código debe ser rediseñado. Pero este no es el alcance de esta pregunta.

+3

¿Estás seguro de que la GUI se congela mientras se carga el mapa? porque TWebBrowser actúa de forma asíncrona. ¿Puedes mostrar el código que estás utilizando para cargar el mapa? – RRUZ

+0

¿Lo ha intentado con TEmbeddedWB desde www.bsalsa.com? Puede que ya tenga una solución y sea muy fácil cambiar a ella y hacer que las cargas asincrónicas funcionen. –

+0

Gracias por las sugerencias RRUZ y WarrenP. RRUZ tiene razón en que ya está cargando de manera asíncrona en TWebBrowser. Entonces, en mi caso, la razón es otra cosa. Tengo que investigar porque el código es bastante complejo ... –

Respuesta

3

Cuando se ejecuta la instrucción if 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, ser conscientes de que ProcessMessages es realmente 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 se puede ver también he cambiado algunas otras cosas de menor importancia. 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 su encuesta Cargando/Procesando? ¿No sería mucho más fácil utilizar el evento OnDocumentComplete de TWebBrowser?

... y otro pensamiento cruzó por mi mente ... ¿Has consultado al 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!

Cuestiones relacionadas