PDA

Просмотр полной версии : Странные ошибки в компонентах


slesh
10.11.2008, 13:55
Довольно странные и специфически ошибка связанные с работой в потоке.


1) Webbrowser и потоки.
Если запустить поток в котором компоненту Webbrowser задастся переход на адрес.
пример

procedure Go(param:pointer);stdcall;
begin
form1.WebBrowser1.Navigate('http://ya.ru');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
thId:dword;
begin
thId:=CreateThread(nil,0,@go,nil,0,thId);
end;

выдает ошибку. Даже прога бывает падает. Причем проявилось тока на Win XP SP2 и SP3. НА Win 2003 - работает нормально.

2) аналогично предудущему через раз отображается inputbox вызываемый в потоке. Причем появляется сообщение типа, канвас не может быть отрисован.
Если через except обработать исключение и заного попробовать повторить операцию то получается. При этом такой глюк независимо от винды

Algol
10.11.2008, 15:15
WebBrowser это ActiveX компонент, и следовательно работает очень специфично в потоках. Лучше всего его запускать только в главном потоке. А еще лучше - вообще не использовать.

Dian
11.11.2008, 04:03
VCL это однопоточная библиотека.
Физически, её, конечно, можно дергать из других потоков, но результат будет обескураживающий.
Обращайся из главного потока, например, через Synchronize()

slesh
11.11.2008, 10:09
Вообще WB я юзал для того чтобы нормально отображать картинки независимо от формата их. bmp,jpg,gif,png Да и облегчает загрузку с удаленных серверов в плане если используется ssl
Но тутже проблема не только с WB но еще и с inputbox который основан тоже на vcl
Хотя на win2003 всё пашет. Так что дело не в многопоточности.
Проблема решена по простому - через посылку форме собственных сообщений и в обработчике стоят все действия.

vid
21.11.2008, 19:55
кури посты про синхронизацию - так как ты делаешь - делать низзя ;)