Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   C# Ungültiger threadübergreifender Vorgang (https://www.delphipraxis.net/66556-ungueltiger-threaduebergreifender-vorgang.html)

Luckie 31. Mär 2006 12:09


Ungültiger threadübergreifender Vorgang
 
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?

Luckie 31. Mär 2006 15:03

Re: Ungültiger threadübergreifender Vorgang
 
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. :gruebel:

Ich gehe mal auf Toilette. :mrgreen:

Elvis 31. Mär 2006 15:31

Re: Ungültiger threadübergreifender Vorgang
 
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? :gruebel:

Luckie 31. Mär 2006 16:45

Re: Ungültiger threadübergreifender Vorgang
 
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?

Elvis 1. Apr 2006 10:06

Re: Ungültiger threadübergreifender Vorgang
 
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);
}

Luckie 1. Apr 2006 14:02

Re: Ungültiger threadübergreifender Vorgang
 
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... :mrgreen:

Elvis 1. Apr 2006 19:07

Re: Ungültiger threadübergreifender Vorgang
 
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. ;)

Luckie 1. Apr 2006 19:10

Re: Ungültiger threadübergreifender Vorgang
 
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.

MathiasSimmack 1. Apr 2006 19:12

Re: Ungültiger threadübergreifender Vorgang
 
Druck´s aus und nimm´s mit aufs Örtchen :mrgreen:

Luckie 2. Apr 2006 22:34

Re: Ungültiger threadübergreifender Vorgang
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:08 Uhr.
Seite 1 von 2  1 2      

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