• Akella-M (18.04.13 13:04) [0]
    В потоке обращаюсь через Syncrhonize к компоненту на форме - ошибка.
    Создаю компонент в потоке - тоже ошибка.

    constructor TSellerReceive.Create(Name: string);
    begin

     CoInitialize(nil);
     inherited Create(True);
     FreeOnTerminate := True;
     GMS:=tmemorystream.Create;
     GCQ:=TSQLQuery.Create(nil);
     GXML:=txmldocument.Create(nil);

    ...

    procedure TSellerReceive.Execute;
    var
      ReceivedXMLText:TStringList;
    begin

      ...
     
      GXML.XML.Text:=ReceivedXMLText.text;
      GXML.Active:=true;

      ...

    тут выдает Exeption ту самую ошибку

    Delphi XE3, Win7x64
  • Медвежонок Пятачок © (18.04.13 14:08) [1]
    все стереть и переписать.
    экземпляр создается в одном потоке, коуинит делается в том же, а используется все это в другом потоке.
  • Akella-M (18.04.13 16:17) [2]
    Не очень понял, но реализовал аналогичную идея используя IXMLDocument2

    Правда 4 потока выдают производительность HTTP метод POST + SQLQuery запрос Insert за три секунды.

    Не пойму почему так долго, средняя скорость аналогичной операции без IXMLDocument2 занимала 1 секунду на 120 записей.

    Может тормозить изза IXMLDocument2?
  • Ega23 © (18.04.13 16:57) [3]
    CoInitialize, CoUninitialize, TXMLDocument.Create(nil) и XML := nil вынести в Execute.
  • Akella-M (18.04.13 20:20) [4]
    Помогло, спасибо.

    Кто будет гуглить эту тему - возможно Вам поможет инфа, что в потоке TXMLDocument.Create нельзя указывать с nil, укажите хотябы application:

    TXMLDocument.Create(Application);

    Иначе будет Invalit Pointer Operation
  • Медвежонок Пятачок © (18.04.13 20:29) [5]
    что в потоке TXMLDocument.Create нельзя указывать с nil,

    Можно.
    Хоть в потоке хоть как. Просто надо хелп читать.
  • Ega23 © (18.04.13 21:13) [6]

    > Кто будет гуглить эту тему - возможно Вам поможет инфа,
    > что в потоке TXMLDocument.Create нельзя указывать с nil,
    >  укажите хотябы application:
    >
    > TXMLDocument.Create(Application);
    >
    > Иначе будет Invalit Pointer Operation


    var
     xml: IXMLDocument
    begin
     xml := TXMLDocument.Create(nil);
    end;

    var
     xml: TXMLDocument;
    begin
     xml := TXMLDocument.Create(SomeOwner);
     try

     finally
       xml.Free  
     end;
    end;



    Почувствуй разницу. В первом случае ты работаешь с ним, как с интерфейсом, при refCount=0 деструктор вызовется автоматически.
    Во втором случае - как с невизуальным компонентом, который можно на форму или в дата-модуль кинуть.
    Ты, скорее всего, объявил его именно как TXMLDocument, вызвал деструктор, а потом деструктор вызвался автоматом повторно при удалении ссылки, о чём исключение IPO и говорит.

    От потока не зависит, в главном будет то же самое.
Есть новые Нет новых   [134431   +9][b:0][p:0.001]