Avatar billede Slettet bruger
30. marts 2006 - 08:52 Der er 11 kommentarer

Delegate listview til en anden tråd, muligt?

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?
Avatar billede segato Nybegynder
30. marts 2006 - 13:26 #1
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.
Avatar billede jess_chr Nybegynder
31. marts 2006 - 17:21 #2
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"
    }     
}
Avatar billede jess_chr Nybegynder
31. marts 2006 - 17:23 #3
DetEventDuLyttePå skal selvfølgelig være objektet der skal udføre et eller andet... Undskyld!
Avatar billede Slettet bruger
03. april 2006 - 08:25 #4
det hele ligge i samme klasse, kan ikke se hvordan jeg skal gøre dette
Avatar billede Slettet bruger
03. april 2006 - 08:29 #5
Klassen det hele liggr i hedder Explorer, jeg skal bruge listView1 i den anden tråd
Avatar billede jess_chr Nybegynder
03. april 2006 - 08:55 #6
hvordan kalder du din anden tråd, hvis det er den samme klasse er listView1 vel tilgængelig!
Avatar billede Slettet bruger
03. april 2006 - 09:00 #7
Jeg starter en ny tråd med en backgroundworker:

FileInfoWorker.RunWorkerAsync();

Det udløser denne event:

private void StartGetFileInfo(object sender, DoWorkEventArgs e)
        {
            SetListviewInfo();
        }


I SetListviewInfo som kører i den nye tråd, skal jeg kunne hente oplysninger YUD fra listview1


private void SetListviewInfo()
        {
            String[] subItems = new String[6];
            bool IsSubFolder = false;

            if (FirstItem == "..")
                IsSubFolder = true;
           

            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);
            }
        }
Avatar billede 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
Avatar billede jess_chr Nybegynder
04. april 2006 - 08:20 #9
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!
Avatar billede 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?
Avatar billede jess_chr Nybegynder
06. april 2006 - 12:20 #11
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! 
    }
  }
}
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester