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