Autor Beitrag
RBS2002
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Fr 04.12.09 00:44 
Hi,

habe leider nichts passendes gefunden, deswegen folgende Frage:

Ich habe mal versucht mein Programm mit Threadaufteilungen ein wenig schneller zu machen (besonders parallele Einlesefunktionalitäten die sonst nacheinander ablaufen). Aber genau dort habe ich ein Problem. Verwende ich eine normale Funktion funktioniert alles, rufe ich die Funktion normal auf funktioniert alles - nur wenn ich die XML Funktion als Thread aufrufe und diesen starte kommt eine Fehlermeldung. Hier mal die einzelnen Codefragmente:

Quellcode Threadaufruf

ausblenden C#-Quelltext
1:
2:
Thread thread = new Thread(new ThreadStart(ladenkategorie));
thread.Start();


Bei diesem Teil kommt die Fehlermeldung (xml_load Funktion)

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
    public void ladenkategorie(){
      try
      {
        xmlDoc.Load("kategorien.xml");
      }


Fehlermeldung:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
System.InvalidOperationException: Das Dokument verfügt bereits über einen 'XmlDeclaration'-Knoten.
   bei System.Xml.XmlDocument.IsValidChildType
   bei System.Xml.XmlDocument.AppendChildForLoad
   bei System.Xml.XmlLoader.LoadDocSequence
   bei System.Xml.XmlLoader.Load
   bei System.Xml.XmlDocument.Load
   bei System.Xml.XmlDocument.Load
   bei Scan2PDF.MainForm.ladenkategorie in c:\Users\BWHK\Documents\Scan2PDF\Scan2PDF\MainForm.cs:Zeile 329
   bei Scan2PDF.MainForm..ctor in c:\Users\BWHK\Documents\Scan2PDF\Scan2PDF\MainForm.cs:Zeile 595
   bei Scan2PDF.Program.Main in c:\Users\BWHK\Documents\Scan2PDF\Scan2PDF\Program.cs:Zeile 27


Kann sich das jemand erklären - wäre nicht schlecht wenn das funktionieren würde,
mfG RBS2002
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 04.12.09 01:06 
XmlDocument ist nicht threadsafe, greifst du denn aus mehreren Threads auf diese Instanz zu?
Am besten gibst du jedem Thread eine eigene Instanz.

_________________
>λ=
RBS2002 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Sa 05.12.09 20:06 
ok, erst einmal danke. Es ist momentan eine Klassenvariable (also keine lokale Funktionsvariable), wahrscheinlich liegt es daran. Wie könnte ich diese Instanz für jeden Thread vergeben?
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 05.12.09 20:12 
Hum, du erstellst sie am Anfang von ladenkategorie :zwinker: ?
Die Daten müssen dann wohl irgendwann den Thread auch wieder verlassen, dazu musst du erst einmal verraten, wie es nach Load weitergehen soll.

_________________
>λ=
RBS2002 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: So 06.12.09 01:58 
ja, das habe ich dann auch vor ;) (Momentan ist die xmldoc Variable, wie gesagt, eine private Klassenvariable - weiss auch nicht wieso ich so etwas gemacht habe, muss wohl aus Zeitgründen entstanden sein - ohne Thread funktionierte es ja). Nach dem Load werden die vorhandenen Einträge gelesen, sollte das Load eine Exception werfen wird die Datei erstellt. Aber ich habe das mal eben schnell ausprobiert - und jetzt funktioniert es zu mindestens auch mit Thread:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
XmlDocument temp_xmlDoc = new XmlDocument();
      try
      {
        temp_xmlDoc.Load("kategorien.xml");
      }
      catch(System.IO.FileNotFoundException)
      {
        xmlcreate("kategorien.xml");
        temp_xmlDoc.Load("kategorien.xml");
      }
      
      XmlNodeList list = temp_xmlDoc.SelectNodes("Root/Dokutyp/Eintrag");
      
      foreach(XmlNode s in list){
        dokutyp.Items.Add(s.InnerText.ToString());
      }
      
      XmlNode temp = temp_xmlDoc.SelectSingleNode("/Root/Kategorie1");
      if(temp != null){
        k1.Text = temp.Attributes["Title"].InnerText.ToString();
      }
      
      list = temp_xmlDoc.SelectNodes("Root/Kategorie1/Eintrag");
      
      foreach(XmlNode s in list){
        liste1.Items.Add(s.InnerText.ToString());
      }
      
      temp = temp_xmlDoc.SelectSingleNode("/Root/Kategorie2");
      if(temp != null){
        k2.Text = temp.Attributes["Title"].InnerText.ToString();
      }
      
      list = temp_xmlDoc.SelectNodes("Root/Kategorie2/Eintrag");
      
      foreach(XmlNode s in list){
        liste2.Items.Add(s.InnerText.ToString());
      }
      
      temp = temp_xmlDoc.SelectSingleNode("/Root/Kategorie3");
      if(temp != null){
        k3.Text = temp.Attributes["Title"].InnerText.ToString();
      }
      
      list = temp_xmlDoc.SelectNodes("Root/Kategorie3/Eintrag");
      
      foreach(XmlNode s in list){
        liste3.Items.Add(s.InnerText.ToString());
      }


Also dafür vielen Dank ;) Das mit der eigenen Instanz würde mich freuen - habe bisher bei C# nichts mit Threads zu tun gehabt ;)


Zuletzt bearbeitet von RBS2002 am So 06.12.09 02:02, insgesamt 1-mal bearbeitet