![]() |
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:
Die Thread Datei
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;
Delphi-Quellcode:
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.
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. Danke im voraus. Sven |
Re: XML Zugriff + Thread
Diese Fehlermeldung ist doch eigentlich sehr aussagekräftig: CoInitialize aufrufen!
|
Re: XML Zugriff + Thread
Ja schon aber ich habe keinen Plan wo und wie? Habe den Befehl einfach mal eingegeben aber ohne Erfolg.
??? |
Re: XML Zugriff + Thread
Zitat:
Delphi-Quellcode:
procedure MyThread.Execute;
begin CoInitialize(nil); ... CoUninitialize(); end; |
Re: XML Zugriff + Thread
CoInitialize(nil); setze ich ein aber er kennt es nicht. Wo muss ich es denn initialisieren?
|
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 11:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz