Re: Threads und BackgroundWorker
Gott sei dank ist in zwanzig Minuten Feierabend.
Und wie und wo implementiere ich, was der delegate machen soll? |
Re: Threads und BackgroundWorker
Zitat:
Code:
MethodInvoker call = delegate
{ SetStatusText(Resources.ThreadStatusFinish); }; Invoke(call); |
Re: Threads und BackgroundWorker
Langsam. Wie eght das jetzt mit dem delegate genau? Ich wollte die Methode auch an anderer Stelle nutzen, als normale Methode.
|
Re: Threads und BackgroundWorker
Code:
delegate void SetStatusTextDelegate(string arg1);
Code:
So müsste es gehen. Ein delegat is nix anderes als ein methodenzeiger in delphi.
Invoke(new SetStatusTextDelegate(SetStatusText), new string[] { "String-parameter" });
|
Re: Threads und BackgroundWorker
Zitat:
Da man aber oft nicht von der Signatur abhängig sein will, wurden anonyme methoden entwickelt. Da du ganz sicher keine Methode in deiner Klasse für jeden kleinen Furz haben willst, kannst du auch anonyme Methoden nehmen. Die sind nur lokal sichtbar und müllen dir deinen Code nicht zu. Im Code existieren sie für dich nur als Delegate, nie als normale Methode. Du kannst so auch Werte übergeben ohne von den Parametern abhängig zu sein, aber das sparen wir uns lieber für den nächsten Thread auf. :mrgreen: |
Re: Threads und BackgroundWorker
:firejump: So geht es. :P
Noch ein letzter Punkt, dann haben wir es geschafft. ;) Die BackgroundWorker Komponente hat j aein Ereignis, welches ausgelöst wird, wenn er fertig ist. Wie kann ich jetzt mit der Thread-Klasse warten? Mittels join friert mir die ganze Anwendung ein:
Code:
private void button1_Click(object sender, EventArgs e)
{ if (rbThread.Checked) { t = new Thread(ThreadProc); t.Name = "Thead"; t.Start(); t.Join() SetStatusText("ThreadStatusFinish"); } else { backgroundWorker1.RunWorkerAsync(); } } |
Re: Threads und BackgroundWorker
Zitat:
|
Re: Threads und BackgroundWorker
Puh. Also so habe ich es jetzt und so geht es auch:
Code:
Man war das eine schwere Geburt. Besten Dank noch mal an alle, die so viel Geduld hatten.
private delegate void ThreadFinishEventHandler(object Sender);
private event ThreadFinishEventHandler OnThreadFinishHandler; private void OnThreadFinish() { if (OnThreadFinishHandler != null) OnThreadFinishHandler(this); } private void ThreadFinish(object Sender) { SetStatusText(resManager.GetString("ThreadStatusFinish")); } private void ThreadProc() { try { for (int i = 0; i < 100000; i++) { Invoke(new MethodInvoker(thread_Event)); Thread.Sleep(0); } this.OnThreadFinishHandler += ThreadFinish; } finally { SetStatusTextDelegate sd = SetStatusText; Invoke(sd, resManager.GetString("ThreadStatusFinish")); } } |
Re: Threads und BackgroundWorker
Zitat:
Du registrierst am Ende ThreadFinish als Handler für einen falsch benannten Event: OnThreadFinishHandler. Das macht doch keinen Sinn? Du würdest den EVENT am Ende feuern, und irgendjemand hätte sich für den registriert.
Code:
private void ThreadProc()
{ try { for (int i = 0; i < 100000; i++) { Invoke(new MethodInvoker(thread_Event)); Thread.Sleep(0); } ThreadFinishEventHandler h = this.ThreadFinished; // so sollte der Event heißen if(h != null) Invoke(h, this); } finally { SetStatusTextDelegate sd = SetStatusText; Invoke(sd, resManager.GetString("ThreadStatusFinish")); } } |
Re: Threads und BackgroundWorker
Oh, dann muss ich es noch mal ändern.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz