Laden...

trotz Thread GUI blockiert

Erstellt von Coooder vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.459 Views
Thema geschlossen
C
Coooder Themenstarter:in
180 Beiträge seit 2011
vor 12 Jahren
trotz Thread GUI blockiert

hi,
damit die Gui nich die ganze zeit blockiert habe ich eine Methode in nem eigenen Thread gepackt da diese unter umstände ein wenig zeit in anspruch nimmt ... aber die GUI blockiert dennoch 😕

hier der Code:

private void startBtn_Click(object sender, EventArgs e)
        {
            if (Directory.Exists(PathToSave))
            {
                progressBar.Value = 0;
                progressBar.Maximum = vidBox.CheckedIndices.Count + picBox.CheckedIndices.Count;

                threadDelegate td = new threadDelegate(ZipIt);
                ThreadStart start = delegate() { BeginInvoke(td, null); };
                Thread thread = new Thread(start);
                thread.Start();
            }
        }

ich meine das eigentlich schonmal so gemacht zu haben 😕 ... was übersehe ich oder was mach ich da falsch?

76 Beiträge seit 2008
vor 12 Jahren

Ich denke, dass du bei

threadDelegate td = new threadDelegate(ZipIt);

bereits den Code startest und ausführen lässt, was folglich die GUI blockeren lässt.. Kann das sein?

C
Coooder Themenstarter:in
180 Beiträge seit 2011
vor 12 Jahren

hmm nee eigentlich nich, glaub ich ^^

der geht das alles schritt für schritt durch und geht dann in die entsprechende Methode 😕

5.742 Beiträge seit 2007
vor 12 Jahren

Hallo Coooder,

siehe die "Falle" in [FAQ] Warum blockiert mein GUI?

BTW: Verwende besser die Task Parallel Library (z.B. System.Threading.Tasks.Factory.StartNew) oder den ThreadPool statt manuell Threads zu erzeugen.
Dann kannst du auch gleich die TPL dazu verwenden, um den GUI-Code zu synchronisieren, siehe Parallel Programming: Task Schedulers and Synchronization Context.

@DeZio: Nein, damit wird lediglich ein Delegat erstellt.

C
Coooder Themenstarter:in
180 Beiträge seit 2011
vor 12 Jahren

hmm hab ich das richtig verstanden, ... man darf aus dem neu erzeugten thread nichts auserhalb aufrufen was zu lange dauert? Weil das kanns nich wirklich sein da ich nur eine variable hoch zähle

hier mal die methode:

private void ZipIt()
        {
            for (int i = 0; i < vidBox.CheckedIndices.Count; i++)
            {
                controller.ZipIt (controller.CurrentContent.VideoContent[vidBox.CheckedIndices[i]]);
                progressBar.Value++;
            }

            for (int i = 0; i < picBox.CheckedIndices.Count; i++)
            {
                controller.ZipIt (controller.CurrentContent.PicContent[picBox.CheckedIndices[i]]);
                progressBar.Value++;
            }
        }
16.806 Beiträge seit 2008
vor 12 Jahren

Hast Du [FAQ] Warum blockiert mein GUI? wirklich gelesen?
Darin wird nämlich beschrieben, wie man das Problem löst. Sowohl, dass die Arbeit ausgelagert wird und auch wie man trotzdem Elemente des Main-Threads aktualisieren kann.

6.862 Beiträge seit 2003
vor 12 Jahren

Dein Code macht doch keinen Sinn. Deine Delegate welches du im Thread startest invoked doch den kompletten Code wieder zurück in die GUI. Dann kann man sich doch gleich den Thread sparen.

Das ist die Falle auf die winSharp93 dich hingewiesen hat, nur das du nicht nur zuviel im GUI Thread ausführst, sondern alles.

Baka wa shinanakya naoranai.

Mein XING Profil.

Hinweis von herbivore vor 12 Jahren

... das steht aber eben alles schon in der FAQ.

Thema geschlossen