Problem mit Thread

arkel

Grünschnabel
Hallo liebe Community,

ich habe ein kleines Problem mit einer Progressbar und weiß nicht genau, wie ich weiterkommen soll. Seit ich von VC#2003 auf VC#2005 (bzw. von .net1.1 auf .net2.0) umgestiegen bin, bekomme ich beim meiner Progrressbar den freundlichen, aber bestimmten Titel "Keine Rückmeldung". Die Progressbar läuft in einem eigenen Fenster, welches über der eigentlichen Applikation liegt.

Jetzt habe ich gelesen, dass dies an meiner Hauptanwendung liegt, die Thumbs erstellt - und das kann schonmal dauern. Ich versuche also, entweder die Bar oder das Generieren in einen eigenen Thread zu legen, aber scheitere leider...

Ich habe es so versucht (vorher war der aufruf von meiner Progressbar ganz am Anfang der Methode generateThumbsX):
Code:
private void generateThumbs()
{
    ProgressDialog myProgressDialog = new ProgressDialog();
    myProgressDialog.ShowText_thumbs();
    myProgressDialog.ShowWindow();
    
     Thread thread = new Thread(new ThreadStart(generateThumbsX));
    thread.Start();
}
private void generateThumbsX()
{

    for(int i = 0; i < lArrImageArrayThumb.Count; i++)
    {
        ...[Thumbs erstellen]...
    }
    
    Control.Invoke(myProgressDialog.Init(lArrThumbsSmall.Count + lArrThumbsMiddle.Count + lArrThumbsLarge.Count + lArrFileNames.Count));
    Control.Invoke(myProgressDialog.ShowText_thumbs());
    
    for(int i = 0; i < lArrFileNames.Count; i++)
    {
        ...[Namen erstellen, speichern]...
    
        Control.Invoke(myProgressDialog.Perform_Step());
    }
    ...
    Control.Invoke(myProgressDialog.Dispose());
}

Leider bekomme ich die Meldung:
Der Name "myProgressDialog" ist im aktuellen Kontext nicht vorhanden.

Wie bringe ich generateThumbsX denn bei, dass da noch ein Thread läuft, auf den ich zugreifen möchte...?

Gruß,
Manu
 
Zum einen solltest du den Dialog nicht lokal innerhalb einer Funktion definieren, denn dass du danach nicht mehr darauf zugreifen kannst, versteht sich von selbst. Definiere es also global außerhalb der Funktion und erstelle nur die Instanz innerhalb der Funktion!
Zum anderen kann es sein, dass ein anderer Thread auf das Objekt nicht zugreifen darf. Zu diesem Zweck solltest du am Anfang der Funktion noch folgende Zeile einbauen:

Code:
Control.CheckForIllegalThreadCross = false;

Gruß
PhoenixLoe
 
Hallo,
du könntest das ProgressDialog-Objekt als Parameter an den Thread übergeben:
C++:
private void generateThumbs()
{
    ProgressDialog myProgressDialog = new ProgressDialog();
    myProgressDialog.ShowText_thumbs();
    myProgressDialog.ShowWindow();

    Thread thread = new Thread(new ParameterizedThreadStart(generateThumbsX));
    thread.Start(myProgressDialog);
}

private void generateThumbsX(object data)
{
    ProgressDialog myProgressDialog = (ProgressDialog)data;
    
    // ...
}
Gruß
MCoder
 
Zurück