Jeg har lavet et folder browser program, "hovedtråden" smider alle mapper og filer ind i mit listview i form 1, når den har gjordt det, starter den en ny tråd der skal finde alle oplysningerne, som accesstime, størrelse osv.. det skal tråden så smide ind i subitemsne efterhånden som den finder det. Mit problem er, at jeg skal læse en masse ting fra det listview i den anden tråd, fx listview.items.count, listview.items.imageindex og text properties osv.. så er de mligt at jeg kan få tilgang til hele listviewet fra den anden tråd?
Hvad hvis du nu har en klasse som holder en en masse info, f.eks. omkring din count. Den har også en funktion som er det du vil køre i en anden tråd. Så kan du jo holde på de tilstande du vil. Hvis du vil have tråden til at signalere vent når noget er sket i tråden kan du bruge AutoResetEvent og ManuelResetEvent.
hvis det er fordi den smider en "cross-thread" Exception når du prøver at arbejde med objektet, kan du bruge denne if sætning til at parse tråden over i din nuværende tråd!
private void DetEventDuLyttePå_IsRaised(object o) { if (this.InvokeRequired) { KlassenPåDetEventDuLytterPå.IsRaised IsRa = new KlassenPåDetEventDuLytterPå.IsRa (DetEventDuLyttePå_IsRaised); this.Invoke(IsRa , new object[] { o}); } else { // her kan du arbejde med "object o" uden at smide // en "cross-Thread Exception" } }
try { for (int i = 0; i < Convert.ToInt32(ItmCount); i++) { if (IsSubFolder) { i = i + 1; IsSubFolder = false; }
FileInfo f = new FileInfo(ItmPath);
if (ImageIndex == 0) { this.Invoke(DelegateAddFileInfo, new Object[] { i, "", GetAssociatedFolderDescription(), f.LastWriteTime.ToString(), f.Attributes.ToString() }); } else { this.Invoke(DelegateAddFileInfo, new Object[] { i, (f.Length / 1024) + " KB", GetAssociatedFileDescription(f.Extension), f.LastWriteTime.ToString(), f.Attributes.ToString() }); } } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
Synes godt om
Slettet bruger
03. april 2006 - 09:01#8
DelegateAddFileInfo er så funktionen der sætter infoen i listview1.. det kan den godt, jeg skal bare kunne hente info ud fra listview1 jo, fx hvor mange items der er, og læse den første item
Det jeg tænker på er, at hvis funktionen du afvikler som en tråd ligger i den samme tråd/klasse som ListView1, burde det være muligt at tilgå dennes properties direkte i tråden, du afvikler blot funktionen asynkront... fx burde du kunne anvende:
int NumOfItems = Listview1.Items.Count;
samt: foreact(object LvItem in Listview.Items){ // og direkte redigere dennes items live, og ikke bruge delagates til dette! }
ellers kan du jo oprette det som en klasse og så medsende de informationer du skal bruge i constructoren
public class MyClass{ public delegate void onDoneEvent(ListView sender); public event onDoneEvent onDone;
public void RaiseonDoneEvent() { onDone(lv); }
ListView lv;
public MyClass(ListView CurrLv){ lv = CurrLv;
new System.Threading.Thread(new System.Threading.ThreadStart(MyWorker)).Start(); }
public void MyWorker(){ // her laver du så dit arbejds sjov og lv skulle meget gerne være tilgængelig!
// og når du så syntes der er noget du har der skal opdateres kalder du blot: RaiseonDoneEvent(); //så kan din hovedtråd ligge og lytte på den! } }
Skrevet efter hukommelse, forvent en del sjuskefejl!
Synes godt om
Slettet bruger
05. april 2006 - 11:04#10
går ud fra den skal se sådan ud?:
public void MyClass(ListView CurrLv) { lv = CurrLv;
new System.Threading.Thread(new System.Threading.ThreadStart(MyWorker)).Start(); }
men, hva bruger du "lv" til her?.. du starter jo bare en ny tråd der kører MyWorker?
Nej, det er en ny klasse, hvor jeg i constructoren starter tråden så det var nu rigtig nok!
jeg kan lige udbygger den lidt...
namespace MyHovedNamespace{ public class MitHovedProgram{
ListView listView1; /*plus en masse form kontoller!*/
MyClass mc;
public void InitializeComponents(){ listView1 = new ListView(); //Windows form generede kode jeg er for doven til at skrive i hånden! }
public MitHovedProgram(){ InitializeComponents(); }
private void MinKnap_Click(object sender, EventArgs e) //skrevet i hånden så der mangler sikkert noget! { mc = new Myclass(listView1); mc.OnDoneEvent += new Myclass.onDoneEvent(this.mc_onDoneEvent); mc.RequistRunWorker(); }
private void mmc_onDoneEvent(ListView sender){ //hernede kan du så arbejde med det opdaterede ListView1 som der blev send med da du oprettede klassen } }
public class MyClass{ public delegate void onDoneEvent(ListView sender); public event onDoneEvent onDone;
public void RaiseonDoneEvent() { onDone(lv); }
ListView lv;
public MyClass(ListView CurrLv){ lv = CurrLv; }
public void RequistRunWorker(){ new System.Threading.Thread(new System.Threading.ThreadStart(MyWorker)).Start(); }
private void MyWorker(){ // her laver du så dit arbejds sjov og lv skulle meget gerne være tilgængelig!
// og når du så syntes der er noget du har der skal opdateres kalder du blot: RaiseonDoneEvent(); //så kan din hovedtråd ligge og lytte på den! } } }
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.