Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XML Zugriff + Thread (https://www.delphipraxis.net/117369-xml-zugriff-thread.html)

Piro 16. Jul 2008 22:37


XML Zugriff + Thread
 
Guten Abend,

ich sitze gerade einen Problem, welches ich nicht lösen kann. Ich habe eine Prozedure, die mehrere Thread öffnet, die den Onlinestatus eines Servers überprüft und in eine XML Datei schreibt. Jeder Server hat seine eigene Datei. Somit kann es nicht zu einer Zugriffsverletzung kommen.

Ich habe mehrere Möglichkeiten ausprobiert aber es funktioniert nicht. Hier meine letzte Möglichkeit.

Fumktion des Aufrufes
Delphi-Quellcode:
procedure Tfrm_main.ServerOnlineCheckToXML;
var
 i     : Integer;
 sid   : String;
 Thread : MyThread;
begin
 for i := 0 to lv_server.Items.Count - 1 do
 begin
   Thread                := MyThread.Create(True);
   Thread.art            := 'ServerOnlineCheckToXML';
   Thread.lvid           := i;
   sid                   := lv_server.Items[i].SubItems[0];
   Thread.sid            := sid;
   Thread.server         := lv_server.Items[i].Caption;
   Thread.FreeOnTerminate := True;
   Thread.Resume;
 end;
end;
Die Thread Datei
Delphi-Quellcode:
unit uThread;

interface

uses
  Classes, SysUtils, MSXML2_TLB;

type
  MyThread = class(TThread)
  private
    { Private-Deklarationen }
  protected
    procedure Execute; override;
    procedure ServerOnlineCheckToXML;
  public
    { Public-Deklarationen }
    art   : String;
    lvid  : Integer;
    sid   : String;
    server : String;
  end;


implementation

uses Dialogs, uMain, uHostAlive, uAddServer, ComCtrls;

{ MyThread }

procedure MyThread.Execute;
begin
 try
   if art = 'ServerOnlineCheckToXML' then
   begin
     ServerOnlineCheckToXML;
     // Synchronize(ServerOnlineCheckToXML); // Damit kommt der Fehler nicht
 except
    on e: exception do begin
      // mache hier irgendetwas mit dem Fehler.
    end;
 end;
end;

procedure MyThread.ServerOnlineCheckToXML;
var
 xmlDoc : IXMLDOMDocument2;
 curNode : IXMLDOMNode;
 status : Integer;
begin
 xmlDoc := CoDOMDocument40.Create; // Hier knallt es zur Laufzeit: CoInitialize has not been called
 xmlDoc.setProperty('NewParser', true);
 xmlDoc.load(frm_main.AppPath + SERVERDIR + sid +'.xml');
 curNode := xmlDoc.documentelement.selectSingleNode('/Server-Monitor/server[sid="'+sid+'"]');

 if IsHostAlive(Server) = True then
 begin
   curNode.selectSingleNode('status').text := '1'; //Server Online
 end
 else
 begin
   curNode.selectSingleNode('status').text := '2'; //Server Offline
 end;

 curNode.selectSingleNode('updated').text := frm_main.SetDateToStr(now) + ' ' + TimeToStr(now);
 xmlDoc.save(frm_main.AppPath + SERVERDIR + sid+'.xml');
end;

end.
Wie bekomme ich dies gelöst. Ich möchte gern die Abfrage nach dem Status und das Wegschreiben in mehren Thread realisieren, die parallel ablaufen. Aber nur mit Synchronize(ServerOnlineCheckToXML) funktioniert es aber dann werden alle Thread nacheinander angearbeitet und meine Anwendung steht für diesen Zeitraum. Sehr unpraktisch. Ich hoffe einer weiß Rat.

Danke im voraus.

Sven

Apollonius 16. Jul 2008 22:42

Re: XML Zugriff + Thread
 
Diese Fehlermeldung ist doch eigentlich sehr aussagekräftig: CoInitialize aufrufen!

Piro 16. Jul 2008 22:53

Re: XML Zugriff + Thread
 
Ja schon aber ich habe keinen Plan wo und wie? Habe den Befehl einfach mal eingegeben aber ohne Erfolg.

???

Bernhard Geyer 17. Jul 2008 06:19

Re: XML Zugriff + Thread
 
Zitat:

Zitat von daywalker299
Ja schon aber ich habe keinen Plan wo und wie? Habe den Befehl einfach mal eingegeben aber ohne Erfolg.

???

Auch wenn das Problem+Lösung COM + Thread schon ca. 100 mal beschrieben wurde:

Delphi-Quellcode:
procedure MyThread.Execute;
begin
  CoInitialize(nil);
  ...
  CoUninitialize();
end;

Piro 17. Jul 2008 20:22

Re: XML Zugriff + Thread
 
CoInitialize(nil); setze ich ein aber er kennt es nicht. Wo muss ich es denn initialisieren?

Piro 17. Jul 2008 20:25

Re: XML Zugriff + Thread
 
Sorry hatte die ActiveX Unit nicht eingebunden. Danke an alle.

Schönen Abend.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz