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:
Wenn ich jetzt in meinem Programm auf den Event reagiere:
private void OnTimedEvent(object source, ElapsedEventArgs e)
{ elapsedTime = GetLastInputTime(); if (FireIdleEvent != null) { if (elapsedTime - idleTime > 0) { FireIdleEvent(this); } } }
Code:
Bekomme ich obige Fehlermeldung:
private void si_FireIdleEvent(object sender)
{ listBox1.Items.Add("System ist idle"); } Zitat:
|
Re: Ungültiger threadübergreifender Vorgang
Ich habe es jetzt mal so probiert:
Code:
Aber das will er nicht, da FillListbox jetzt doppelt deklariert ist. :gruebel:
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"); } Ich gehe mal auf Toilette. :mrgreen: |
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: |
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?
|
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:
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:
Als SynchronizeTarget kannst du das Form selbst wählen. Noch eine Listbox und einen Button druff und das hier als Events verdrahten:
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(); }
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); } |
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: |
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. ;) |
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.
|
Re: Ungültiger threadübergreifender Vorgang
Druck´s aus und nimm´s mit aufs Örtchen :mrgreen:
|
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. |
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