2012-03-01 31 views
21

Tôi sử dụng TWebBrowser để hiển thị bản đồ Google. Vấn đề là nó chặn luồng ui chính trong khi nó tải bản đồ. Có thể cập nhật bản đồ trong một chủ đề riêng biệt không?Cập nhật TWebBrowser trong một chuỗi riêng biệt?

Chỉnh sửa: RRUZ bạn đúng TWebBrowser có tải không đồng bộ cho URL. Nhưng tôi thấy vấn đề tại sao nó khối Cuộc gọi:

if WaitWhileProcessing and (MapQueryResult.Count > 0) then 
    Result := MapQueryResult[0] as TMapQuery; 

và phương pháp:

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; 

Vì vậy, có vẻ như để sửa lỗi này mã nên được refactored. Nhưng đây không phải là phạm vi cho câu hỏi này.

+3

Bạn có chắc chắn giao diện đồ họa trong khi bản đồ được tải không? vì TWebBrowser hoạt động không đồng bộ. bạn có thể hiển thị mã mà bạn đang sử dụng để tải bản đồ không? – RRUZ

+0

Bạn đã thử với TEmbeddedWB từ www.bsalsa.com chưa? Nó có thể có một giải pháp đã được, và khá dễ dàng để chuyển sang nó và nhận được tải async làm việc. –

+0

Cảm ơn các đề xuất cả RRUZ và WarrenP. RRUZ đúng là nó đã tải không đồng bộ trong TWebBrowser. Vì vậy, trong trường hợp của tôi lý do là cái gì khác. Tôi phải điều tra vì mã khá phức tạp ... –

Trả lời

3

Khi câu lệnh if được thực hiện và gọi WaitWhileProcessing để đánh giá điều kiện, nó lặp lại 100 lần với lần thứ 10 của giấc ngủ thứ hai. Nhưng những thông điệp nào đang chờ đợi khi gọi ProcessMessages? Phương pháp này có thể được gọi lại một cách đệ quy không? Nó sẽ không bao giờ nhận được vào giấc ngủ nhưng giữ gọi phương pháp này. Bằng cách này, lưu ý rằng ProcessMessages là thực hành thực sự xấu, nhưng bây giờ ... thử này:

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; 

Như bạn có thể thấy tôi cũng đã thay đổi một số điều nhỏ khác. Việc ngắt không ở trong điều kiện trong khi và kết quả đơn giản là kết quả của việc xử lý hoặc tải (vì biểu thức đó cho kết quả thực tế). Hàm isWaitWhileProcessingBusy thừa bên ngoài hàm giữ vòng lặp tin nhắn không được nhập lại. Hy vọng rằng sẽ ngăn chặn khóa giao diện người dùng. Đây cũng không phải là cách thực hành tốt nhất nhưng hiện tại nó chỉ có thể giúp giải quyết và xác định được vấn đề.

Có lý do nào khiến bạn thăm dò ý kiến ​​Loading/Processing không? Nó sẽ không dễ dàng hơn nhiều khi sử dụng sự kiện OnDocumentComplete của TWebBrowser?

... và một ý nghĩ khác vượt qua tâm trí của tôi ... Bạn đã kiểm tra trình quản lý tác vụ chưa? bản đồ google đang sử dụng flash, một thành phần activex cũng sử dụng Giao diện người dùng chính. Đây cũng có thể là nguồn tài nguyên gây ra nạn đói.

Chúc may mắn!

Các vấn đề liên quan