Thema: Delphi XML Zugriff + Thread

Einzelnen Beitrag anzeigen

Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#1

XML Zugriff + Thread

  Alt 16. Jul 2008, 23:37
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 = 'ServerOnlineCheckToXMLthen
   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
  Mit Zitat antworten Zitat