App installieren
How to install the app on iOS
Follow along with the video below to see how to install our site as a web app on your home screen.
Anmerkung: This feature may not be available in some browsers.
Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
C# ListView Elemente threadsicher aufrufen
- Ersteller bill
- Erstellt am
bill
Commodore Special
- Mitglied seit
- 18.02.2003
- Beiträge
- 419
- Renomée
- 4
- Mein Laptop
- IBM ThinkPad X60s
- Prozessor
- intel E8400@4005MHz
- Mainboard
- MSI P35 Neo2-FR
- Kühlung
- Scythe Zipang
- Speicher
- 4*1024 GeIL PC2-6400U CL4-4-4-12
- Grafikprozessor
- BFG GeForce 8800 GTS OC (G92)
- Display
- hp w2408h 24" TFT @ 1920x1200
- HDD
- Samsung SpinPoint F1 750GB, Samsung SpinPoint 250GB
- Optisches Laufwerk
- LG E40N, Toshiba DVD-ROM SD-M1612
- Soundkarte
- SoundBlaster Audigy 2
- Gehäuse
- Antec P190
- Netzteil
- Antec DualLink 1200W
- Betriebssystem
- Windows 7
- Webbrowser
- Firefox
Hallo!
Bräuchte mal eure Hilfe!! Folgendes Problem:
Ich habe einen BackgroundWorker, welcher in seiner DoWork() Methode, die Elemente einer ListView auslesen und bearbeiten soll. Die ListView ist dabei natürlich im Main-Form erstellt.
Leider funktioniert das nicht so ganz. Der Debugger meldet zur Laufzeit, dass der Thread versucht, auf Elemente zuzugreifen, die nicht von ihm erstellt wurden.
Dabei versuche ich per Delegate und Invoke an die Elemente zu kommen.
Das ganze sieht ungefähr so aus:
Was mache ich falsch?
Wäre super wenn mir jemand helfen könnte!
Gruß,
bill
Bräuchte mal eure Hilfe!! Folgendes Problem:
Ich habe einen BackgroundWorker, welcher in seiner DoWork() Methode, die Elemente einer ListView auslesen und bearbeiten soll. Die ListView ist dabei natürlich im Main-Form erstellt.
Leider funktioniert das nicht so ganz. Der Debugger meldet zur Laufzeit, dass der Thread versucht, auf Elemente zuzugreifen, die nicht von ihm erstellt wurden.
Dabei versuche ich per Delegate und Invoke an die Elemente zu kommen.
Das ganze sieht ungefähr so aus:
Code:
[COLOR="Red"]//Der delegate[/COLOR]
private delegate ListView.CheckedListViewItemCollection ListViewItemsCallback();
[COLOR="Red"]//Die DoWork Methode des BackgroundWorkers[/COLOR]
private void DoWork(object sender, DoWorkEventArgs e)
{
...
ListView.CheckedListViewItemCollection CheckedItems;
if (listView.InvokeRequired)
{
[COLOR="Red"]//CheckedItems per delegate/invoke holen[/COLOR]
ListViewItemsCallback lv = new ListViewItemsCallback(getCheckedItems);
CheckedItems = (ListView.CheckedListViewItemCollection)this.Invoke(lv);
}
else
{
CheckedItems = listView.CheckedItems;
}
[COLOR="Red"] //Hier mag der Debugger die ChekcedItems nicht und meckert[/COLOR]
foreach (ListViewItem item in CheckedItems)
{
..
}
...
}
[COLOR="Red"]//Getter Funktion, um auf die checked items per delegate zurückzugreifen[/COLOR]
private ListView.CheckedListViewItemCollection getCheckedItems()
{
return listView.CheckedItems;
}
Was mache ich falsch?
Wäre super wenn mir jemand helfen könnte!
Gruß,
bill
Ray
Grand Admiral Special
- Mitglied seit
- 11.11.2001
- Beiträge
- 3.141
- Renomée
- 20
- Standort
- An der Spree
- Mein Laptop
- Kein Notbuch
- Prozessor
- Intel Core2Quad Q9650@3.8, AMD Ryzen 9 under test
- Mainboard
- DFI LANPARTY LT X48-T2R + MIPS DFI LANparty P35/X38/X48 Series Freezer Set Nickel
- Kühlung
- EK-Supreme
- Speicher
- 4 x 2 GB OCZ PC2 8500 C5 Reaper@500
- Grafikprozessor
- XFX 8800 GTS(G92) 512 + EK-FC8800 GT/GTS(g92)
- Display
- TFT HP w2408h, 1920x1200
- SSD
- Samsung 840 Pro 256 GB
- HDD
- 2 x WD Black 1TB
- Optisches Laufwerk
- Samsung SH-D163A, Samsung SH-S183A
- Soundkarte
- Creative X-FI Xtreme Gamer Fatality Pro
- Gehäuse
- Modified Lian Li PC201B
- Netzteil
- Seasonic S12 550W
- Betriebssystem
- Win7U-64
- Webbrowser
- FireFox
- Verschiedenes
- Thermochill PA120.3 Triple Radiator , Liang DDC , 11 years old mainboard, still running!
Ich kenn mich jetzt mit C# nicht besonders aus, komme aus der C/C++ Ecke, aber in Deinem Code kann ich keine Maßnahmen zur Threadsynchronisation erkennen.
bill
Commodore Special
- Mitglied seit
- 18.02.2003
- Beiträge
- 419
- Renomée
- 4
- Mein Laptop
- IBM ThinkPad X60s
- Prozessor
- intel E8400@4005MHz
- Mainboard
- MSI P35 Neo2-FR
- Kühlung
- Scythe Zipang
- Speicher
- 4*1024 GeIL PC2-6400U CL4-4-4-12
- Grafikprozessor
- BFG GeForce 8800 GTS OC (G92)
- Display
- hp w2408h 24" TFT @ 1920x1200
- HDD
- Samsung SpinPoint F1 750GB, Samsung SpinPoint 250GB
- Optisches Laufwerk
- LG E40N, Toshiba DVD-ROM SD-M1612
- Soundkarte
- SoundBlaster Audigy 2
- Gehäuse
- Antec P190
- Netzteil
- Antec DualLink 1200W
- Betriebssystem
- Windows 7
- Webbrowser
- Firefox
Hallo!
Das sollte eigentlich dieser Abschnitt bewerkstelligen:
Könnte es aber auch total falsch gemacht haben und es natürlich anders viel einfacher geht
So ganz blick ich die Thread-Geschichte in C# noch nicht, deswegen frage ich ja
Also Ziel ist es, dass ich im BackgroundWorker (Thread) irgendwie an die Liste der Elemente der ListView rankomme. Habe das ganze jetzt ein bischen umgeschrieben, so dass ich dem BackgroundWorker 'ne Kopie Liste der Elemente als Parameter übergebe. Damit hat es dann zwar anscheinend Funktioniert, jedoch nicht wie ichs mir vorgestellt hatte.
In der Liste stehen übrigens Eingabe- und Zieldateinamen, die der Worker Thread dann alle kopieren soll.
Gruß,
bill
Das sollte eigentlich dieser Abschnitt bewerkstelligen:
Code:
//CheckedItems per delegate/invoke holen
ListViewItemsCallback lv = new ListViewItemsCallback(getCheckedItems);
CheckedItems = (ListView.CheckedListViewItemCollection)this.Invoke(lv);
Könnte es aber auch total falsch gemacht haben und es natürlich anders viel einfacher geht
So ganz blick ich die Thread-Geschichte in C# noch nicht, deswegen frage ich ja
Also Ziel ist es, dass ich im BackgroundWorker (Thread) irgendwie an die Liste der Elemente der ListView rankomme. Habe das ganze jetzt ein bischen umgeschrieben, so dass ich dem BackgroundWorker 'ne Kopie Liste der Elemente als Parameter übergebe. Damit hat es dann zwar anscheinend Funktioniert, jedoch nicht wie ichs mir vorgestellt hatte.
In der Liste stehen übrigens Eingabe- und Zieldateinamen, die der Worker Thread dann alle kopieren soll.
Gruß,
bill
Ray
Grand Admiral Special
- Mitglied seit
- 11.11.2001
- Beiträge
- 3.141
- Renomée
- 20
- Standort
- An der Spree
- Mein Laptop
- Kein Notbuch
- Prozessor
- Intel Core2Quad Q9650@3.8, AMD Ryzen 9 under test
- Mainboard
- DFI LANPARTY LT X48-T2R + MIPS DFI LANparty P35/X38/X48 Series Freezer Set Nickel
- Kühlung
- EK-Supreme
- Speicher
- 4 x 2 GB OCZ PC2 8500 C5 Reaper@500
- Grafikprozessor
- XFX 8800 GTS(G92) 512 + EK-FC8800 GT/GTS(g92)
- Display
- TFT HP w2408h, 1920x1200
- SSD
- Samsung 840 Pro 256 GB
- HDD
- 2 x WD Black 1TB
- Optisches Laufwerk
- Samsung SH-D163A, Samsung SH-S183A
- Soundkarte
- Creative X-FI Xtreme Gamer Fatality Pro
- Gehäuse
- Modified Lian Li PC201B
- Netzteil
- Seasonic S12 550W
- Betriebssystem
- Win7U-64
- Webbrowser
- FireFox
- Verschiedenes
- Thermochill PA120.3 Triple Radiator , Liang DDC , 11 years old mainboard, still running!
Ich seh immer noch nichts, was mit threadsicheren Code zu tun hat...
Wenn Du eine Kopie der Liste benützten willst, dann brauchst Du keine Threadsynchronisation, allenfalls während des Kopiervorgangs.
Wenn Du aus verschiedenen Threads aus eine Liste bearbeiten willst, müssen alle Methoden, welche die Liste in irgendeiner Form verändern, threadsicher ausgelegt sein.
C# bzw. VisualC bietet doch regen Support dafür, wie z.B Monitor und Synchronized methods.
Musst Dich einfach mal in der Hilfe unter "Synchronizing Data for Multithreading" einlesen.
Wenn Du eine Kopie der Liste benützten willst, dann brauchst Du keine Threadsynchronisation, allenfalls während des Kopiervorgangs.
Wenn Du aus verschiedenen Threads aus eine Liste bearbeiten willst, müssen alle Methoden, welche die Liste in irgendeiner Form verändern, threadsicher ausgelegt sein.
C# bzw. VisualC bietet doch regen Support dafür, wie z.B Monitor und Synchronized methods.
Musst Dich einfach mal in der Hilfe unter "Synchronizing Data for Multithreading" einlesen.
Was mache ich falsch?
Du erstellst keine Kopie der Liste. getCheckedItems() liefert eine Referenz auf die Collection, auf die Du dann vom BackgroundWorker aus zugreifst. Und dann krachts. Wieso übergibst Du dem BackgroundWorker nicht einfach eine (echte) Kopie (Deep Copy) der Collection als Argument (RunWorkerAsync(<argument>)), auf die der BackgroundWorker dann ohne Locking etc. zugreifen kann?
bill
Commodore Special
- Mitglied seit
- 18.02.2003
- Beiträge
- 419
- Renomée
- 4
- Mein Laptop
- IBM ThinkPad X60s
- Prozessor
- intel E8400@4005MHz
- Mainboard
- MSI P35 Neo2-FR
- Kühlung
- Scythe Zipang
- Speicher
- 4*1024 GeIL PC2-6400U CL4-4-4-12
- Grafikprozessor
- BFG GeForce 8800 GTS OC (G92)
- Display
- hp w2408h 24" TFT @ 1920x1200
- HDD
- Samsung SpinPoint F1 750GB, Samsung SpinPoint 250GB
- Optisches Laufwerk
- LG E40N, Toshiba DVD-ROM SD-M1612
- Soundkarte
- SoundBlaster Audigy 2
- Gehäuse
- Antec P190
- Netzteil
- Antec DualLink 1200W
- Betriebssystem
- Windows 7
- Webbrowser
- Firefox
Wie ich schon vorher gepostet hatte, habe ich das heute auch so gemacht, nur leider kamen da andere Schwierigkeiten auf...wäre aber schon der richtige Weg mit der DeepCopy, oder?
Was ich halt noch gerne hätte, wäre dass der WorkerThread die Elemente der ListView, die erschon abgearbeitet hat, verändert (z.B. die Background color neu setzt). Aber dass könnte ich ja dann theoretisch mit einem Delegate/Invoke machen, oder?
Werde mich jedenfalls mal nochmals zu dem Thema einlesen, ist halt schon ein Weilchen her, wo ich mich damit beschäftigt habe, und dazu war's noch in Java...
Google spuckt schon 'ne Menge zum Thema aus, aber kennt ihr da vielleicht ein paar konkrete Tipps zum einlesen?
Danke euch,
bill
Was ich halt noch gerne hätte, wäre dass der WorkerThread die Elemente der ListView, die erschon abgearbeitet hat, verändert (z.B. die Background color neu setzt). Aber dass könnte ich ja dann theoretisch mit einem Delegate/Invoke machen, oder?
Werde mich jedenfalls mal nochmals zu dem Thema einlesen, ist halt schon ein Weilchen her, wo ich mich damit beschäftigt habe, und dazu war's noch in Java...
Google spuckt schon 'ne Menge zum Thema aus, aber kennt ihr da vielleicht ein paar konkrete Tipps zum einlesen?
Danke euch,
bill
Ray
Grand Admiral Special
- Mitglied seit
- 11.11.2001
- Beiträge
- 3.141
- Renomée
- 20
- Standort
- An der Spree
- Mein Laptop
- Kein Notbuch
- Prozessor
- Intel Core2Quad Q9650@3.8, AMD Ryzen 9 under test
- Mainboard
- DFI LANPARTY LT X48-T2R + MIPS DFI LANparty P35/X38/X48 Series Freezer Set Nickel
- Kühlung
- EK-Supreme
- Speicher
- 4 x 2 GB OCZ PC2 8500 C5 Reaper@500
- Grafikprozessor
- XFX 8800 GTS(G92) 512 + EK-FC8800 GT/GTS(g92)
- Display
- TFT HP w2408h, 1920x1200
- SSD
- Samsung 840 Pro 256 GB
- HDD
- 2 x WD Black 1TB
- Optisches Laufwerk
- Samsung SH-D163A, Samsung SH-S183A
- Soundkarte
- Creative X-FI Xtreme Gamer Fatality Pro
- Gehäuse
- Modified Lian Li PC201B
- Netzteil
- Seasonic S12 550W
- Betriebssystem
- Win7U-64
- Webbrowser
- FireFox
- Verschiedenes
- Thermochill PA120.3 Triple Radiator , Liang DDC , 11 years old mainboard, still running!
Benützt Du Visual C? -->> Hilfefunktion.Google spuckt schon 'ne Menge zum Thema aus, aber kennt ihr da vielleicht ein paar konkrete Tipps zum einlesen?
Oder Microsoft MSDN- und Visual C Seiten.
Nach Themen wie "Monitor", "Synchronized methods" und "Synchronizing Data for Multithreading" suchen.
Was ich halt noch gerne hätte, wäre dass der WorkerThread die Elemente der ListView, die erschon abgearbeitet hat, verändert (z.B. die Background color neu setzt). Aber dass könnte ich ja dann theoretisch mit einem Delegate/Invoke machen, oder?
Kann man machen. Da Du aber sowieso schon 'nen BackgroundWorker einsetzt, würde ich dafür gleich dessen Methode ReportProgress(int, object) verwenden, dann brauchst Du Dich nicht manuell darum zu kümmern, daß die Aktion im UI-Thread abläuft.
Edit:
Lesestoff:
http://www.albahari.com/threading
http://www.yoda.arachsys.com/csharp/threads
http://weblogs.asp.net/justin_rogers/articles/126345.aspx
Zuletzt bearbeitet:
BoMbY
Grand Admiral Special
- Mitglied seit
- 22.11.2001
- Beiträge
- 7.468
- Renomée
- 293
- Standort
- Aachen
- Prozessor
- Ryzen 3700X
- Mainboard
- Gigabyte X570 Aorus Elite
- Kühlung
- Noctua NH-U12A
- Speicher
- 2x16 GB, G.Skill F4-3200C14D-32GVK @ 3600 16-16-16-32-48-1T
- Grafikprozessor
- RX 5700 XTX
- Display
- Samsung CHG70, 32", 2560x1440@144Hz, FreeSync2
- SSD
- AORUS NVMe Gen4 SSD 2TB, Samsung 960 EVO 1TB, Samsung 840 EVO 1TB, Samsung 850 EVO 512GB
- Optisches Laufwerk
- Sony BD-5300S-0B (eSATA)
- Gehäuse
- Phanteks Evolv ATX
- Netzteil
- Enermax Platimax D.F. 750W
- Betriebssystem
- Windows 10
- Webbrowser
- Firefox
Wenn Du den Zugriff auf ein Objekt synchronisieren möchtest, machst Du in C# am einfachsten ein lock()-Block drumherum:
z.B.:
http://msdn2.microsoft.com/en-us/library/ms173179(VS.80).aspx
Gruß,
BoMbY
z.B.:
Code:
lock (listView)
{
// hier drin ist der Zugriff (jedenfalls auf das Objekt listView) serialisiert
}
http://msdn2.microsoft.com/en-us/library/ms173179(VS.80).aspx
Gruß,
BoMbY
http://msdn2.microsoft.com/en-us/library/ms173179(VS.80).aspxCode:lock (listView) { // hier drin ist der Zugriff (jedenfalls auf das Objekt listView) serialisiert }
Nützt ihm in diesem Fall nichts, da auf das ListView sowieso nur der UI-Thread zugreifen darf und eine Synchronisation an dieser Stelle folglich nicht erforderlich ist.
Ähnliche Themen
- Antworten
- 2
- Aufrufe
- 5K
- Antworten
- 3
- Aufrufe
- 7K
- Antworten
- 0
- Aufrufe
- 134K