AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) C# Ungültiger threadübergreifender Vorgang
Thema durchsuchen
Ansicht
Themen-Optionen

Ungültiger threadübergreifender Vorgang

Ein Thema von Luckie · begonnen am 31. Mär 2006 · letzter Beitrag vom 3. Apr 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Luckie
Luckie

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

Ungültiger threadübergreifender Vorgang

  Alt 31. Mär 2006, 13:09
Genau das Problem habe ich. Ich habe in einer Klasse einen Timer und in dem Timer Ereignis wird ein Ereignis der Klasse ausgelöst:
Code:
        private void OnTimedEvent(object source, ElapsedEventArgs e)
        {           
            elapsedTime = GetLastInputTime();
            if (FireIdleEvent != null)
            {               
                if (elapsedTime - idleTime > 0)
                {
                    FireIdleEvent(this);                  
                }
            }
        }
Wenn ich jetzt in meinem Programm auf den Event reagiere:
Code:
        private void si_FireIdleEvent(object sender)
        {
            listBox1.Items.Add("System ist idle");
        }
Bekomme ich obige Fehlermeldung:
Zitat:
Ungültiger threadübergreifender Vorgang
Da der Timer wohl in einem eigenen Thread läuft. Aber wie kann ich jetzt threadübergreifen auf die Listbox zugreifen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Ungültiger threadübergreifender Vorgang

  Alt 31. Mär 2006, 16:03
Ich habe es jetzt mal so probiert:
Code:
        private delegate void FillLb();
        private event FillLb FillListbox;      
       
        private void FillListbox()
        {
            listBox1.Items.Add("System ist idle");
        }       

        private void si_FireIdleEvent(object sender)
        {
            listBox1.Invoke(Form1.FillLb);
            //listBox1.Items.Add("System ist idle");
        }
Aber das will er nicht, da FillListbox jetzt doppelt deklariert ist.

Ich gehe mal auf Toilette.
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
 
#3

Re: Ungültiger threadübergreifender Vorgang

  Alt 31. Mär 2006, 16:31
Willst du eine VB-Dummy-lösung kannst du dir die Komponente BackgroundWorker anschauen.

Um sicherzustellen, dass du eine Methode synchron zum Thread eines controls ausführst Gibt es Control.Invoke. Das war schonmal richtig.
Aaber müssen wir verstehen, warum Event und Methode bei dir gleich heißen?
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
 
#4

Re: Ungültiger threadübergreifender Vorgang

  Alt 31. Mär 2006, 17:45
Nun ja. Ich bin in C# noch nicht so fit und weiß ehrlich gesagt nicht so richtigm was ich da machen. Aber jetzt wo du es sagst, habe ich eine leichte Ahnung, was ich falsch mache. Aber eigentlich auch nicht so wirklich. Wie würde dein eine Lösing mit meinem Code aussehen?
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
 
#5

Re: Ungültiger threadübergreifender Vorgang

  Alt 1. Apr 2006, 11:06
In deinem Code war wohl einfach das Problem, dass er beim Invoke die Methode dem gleichnamigen Event vorgezogen hat.
Zitat:
Wie würde dein eine Lösing mit meinem Code aussehen?
Hier ist ein kleiner Bleistift.
Lege einfach eine neue WindowsApp an und darin eine neue Component.
Schmeiße das hier in die Component und ziehe sie danach auf dein MainForm:
Code:
Control synchronizeTarget;

public Control SynchronizeTarget
{
  get { return synchronizeTarget; }
  set { synchronizeTarget = value; }
}

public event EventHandler Event;

protected virtual void OnEvent()
{
  if (Event != null)
    if (synchronizeTarget != null)
      synchronizeTarget.Invoke(Event, this, EventArgs.Empty);
    else
      Event(this, EventArgs.Empty);
}

public void Run(int iterations)
{
  ThreadStart call = delegate
  {
    for (int i = 0; i < iterations; i++)
    {
      Thread.Sleep(1000);
      OnEvent();
    }
  };

  Thread thread = new Thread(call);
  thread.Start();
}
Als SynchronizeTarget kannst du das Form selbst wählen. Noch eine Listbox und einen Button druff und das hier als Events verdrahten:
Code:
private void asyncSample1_Event(object sender, EventArgs e)
{
  listBox1.Items.Add("...");
}

private void button1_Click(object sender, EventArgs e)
{
  listBox1.Items.Clear();
  asyncSample1.Run(10);
}
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
 
#6

Re: Ungültiger threadübergreifender Vorgang

  Alt 1. Apr 2006, 15:02
Uff. Ich will doch einfach nur was in eine Listbox eintragen. OK, ich werde mir das am montag mal an der Arbeit angucken.

Falls jemand etwas einfachheres anzubieten hat...
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
 
#7

Re: Ungültiger threadübergreifender Vorgang

  Alt 1. Apr 2006, 20:07
Ich habe das Beispiel mit der Extrakomponente eigentlich gewählt um die Herangehensweise einfacher und unabhängig von 1.000 Zeilen ekligem GUI-Codes zeigen zu können.
Würde mich doch arg wundern, wenn du das Prinzip nicht für dich ummünzen könntest.
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
 
#8

Re: Ungültiger threadübergreifender Vorgang

  Alt 1. Apr 2006, 20:10
Ja, aber ich wollte es einfach mal mit einem einfachen konkreten Fall von mir verstehen, was da passiert und was ich machen muss, damit es funktioniert. Wen ich das verstanden habe, dann kann ich auch deine Komponente in Zukunft benutzen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#9

Re: Ungültiger threadübergreifender Vorgang

  Alt 1. Apr 2006, 20:12
Druck´s aus und nimm´s mit aufs Örtchen
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Ungültiger threadübergreifender Vorgang

  Alt 2. Apr 2006, 23:34
So, morgen ist Montag und ich habe wieder das Problem. Ich will einfach nur etwas in die Listbox reinschreiben, ohne Klasse, ohne Komponente. Sollte ich es öfters machen müssen, werde ich wharscheinblich auf die Komponente zurückgreifen, aber im Moment will ich nur wissen, wie ich das synchron in die Listbox schreiben kann. Das kann doch nicht so schwer sein.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:46 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