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?
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?
hmm nee eigentlich nich, glaub ich ^^
der geht das alles schritt für schritt durch und geht dann in die entsprechende Methode 😕
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.
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++;
}
}
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
... das steht aber eben alles schon in der FAQ.