Странные ошибки в компонентах

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by slesh, 10 Nov 2008.

  1. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Довольно странные и специфически ошибка связанные с работой в потоке.


    1) Webbrowser и потоки.
    Если запустить поток в котором компоненту Webbrowser задастся переход на адрес.
    пример
    Code:
    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 обработать исключение и заного попробовать повторить операцию то получается. При этом такой глюк независимо от винды
     
  2. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    WebBrowser это ActiveX компонент, и следовательно работает очень специфично в потоках. Лучше всего его запускать только в главном потоке. А еще лучше - вообще не использовать.
     
  3. Dian

    Dian Elder - Старейшина

    Joined:
    2 Sep 2008
    Messages:
    57
    Likes Received:
    11
    Reputations:
    4
    VCL это однопоточная библиотека.
    Физически, её, конечно, можно дергать из других потоков, но результат будет обескураживающий.
    Обращайся из главного потока, например, через Synchronize()
     
    1 person likes this.
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Вообще WB я юзал для того чтобы нормально отображать картинки независимо от формата их. bmp,jpg,gif,png Да и облегчает загрузку с удаленных серверов в плане если используется ssl
    Но тутже проблема не только с WB но еще и с inputbox который основан тоже на vcl
    Хотя на win2003 всё пашет. Так что дело не в многопоточности.
    Проблема решена по простому - через посылку форме собственных сообщений и в обработчике стоят все действия.
     
  5. vid

    vid Member

    Joined:
    16 Aug 2006
    Messages:
    20
    Likes Received:
    5
    Reputations:
    0
    кури посты про синхронизацию - так как ты делаешь - делать низзя ;)