AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Threads und BackgroundWorker

Ein Thema von Luckie · begonnen am 13. Mär 2008 · letzter Beitrag vom 14. Mär 2008
Antwort Antwort
Seite 4 von 4   « Erste     234   
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#31

Re: Threads und BackgroundWorker

  Alt 14. Mär 2008, 15:41
Gott sei dank ist in zwanzig Minuten Feierabend.

Und wie und wo implementiere ich, was der delegate machen soll?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#32

Re: Threads und BackgroundWorker

  Alt 14. Mär 2008, 15:42
Zitat von phXql:
Das Problem ist, dass SetStatusText(resManager.GetString("ThreadStatusFi nish")) kein Delegat ist. Bei deinem anderen Invoke-Aufruf hast du das ja auch zuerst in den MethodInvoker-delegaten verpackt.
Oder einfach eine anonyme Methode ohne Parameter:
Code:
MethodInvoker call = delegate
{
  SetStatusText(Resources.ThreadStatusFinish);
};

Invoke(call);
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#33

Re: Threads und BackgroundWorker

  Alt 14. Mär 2008, 15:50
Langsam. Wie eght das jetzt mit dem delegate genau? Ich wollte die Methode auch an anderer Stelle nutzen, als normale Methode.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von phXql
phXql

Registriert seit: 11. Mär 2004
Ort: Mühldorf
824 Beiträge
 
#34

Re: Threads und BackgroundWorker

  Alt 14. Mär 2008, 15:56
Code:
delegate void SetStatusTextDelegate(string arg1);
Code:
Invoke(new SetStatusTextDelegate(SetStatusText), new string[] { "String-parameter" });
So müsste es gehen. Ein delegat is nix anderes als ein methodenzeiger in delphi.
"Dunkel die andere Seite ist"
"Yoda! Halts Maul und iss deinen Toast!"
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#35

Re: Threads und BackgroundWorker

  Alt 14. Mär 2008, 15:58
Zitat von Luckie:
Langsam. Wie eght das jetzt mit dem delegate genau? Ich wollte die Methode auch an anderer Stelle nutzen, als normale Methode.
Ein Delegate ist ein Hybride aus Methodenzeiger und Funktionszeiger. (man ihm kann beides zuweisen)

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.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#36

Re: Threads und BackgroundWorker

  Alt 14. Mär 2008, 16:08
So geht es.

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();
            }
        }
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#37

Re: Threads und BackgroundWorker

  Alt 14. Mär 2008, 16:14
Zitat von Luckie:
So geht es.

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
Indem du es einfach selbst auslöst?
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#38

Re: Threads und BackgroundWorker

  Alt 14. Mär 2008, 16:50
Puh. Also so habe ich es jetzt und so geht es auch:

Code:
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"));              
            }
        }
Man war das eine schwere Geburt. Besten Dank noch mal an alle, die so viel Geduld hatten.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#39

Re: Threads und BackgroundWorker

  Alt 14. Mär 2008, 17:26
Zitat von Luckie:
Puh. Also so habe ich es jetzt und so geht es auch:
Nein, ist falsch.
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"));              
    }
}
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#40

Re: Threads und BackgroundWorker

  Alt 14. Mär 2008, 21:42
Oh, dann muss ich es noch mal ändern.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 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