Autor Beitrag
ReBeL1337
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 22



BeitragVerfasst: Mo 25.02.08 13:53 
Ich habe mich die letzten paar Stunden durch viele Seiten gelesen.
Aber ich muss zugeben das ich kaum was damit anfangen kann weil entweder passen die beispiele nicht so ganz zu dem was ich mache, also ich kann nicht so viel verwenden. Ich habe es zwar geschaft mit dem lable und einem text ausgeben, aber leider kann ich da snicht auf mein problem übertragen.
Und ich habe gerde mal 1 Jahr pogramieren und das dann auch nur 2 Stunden die Woche.

Ich möchte gern dieses hier, in einen Tread schreiben damit, wenn das läuft, ich auch noch das "Hauptprogramm" bedienen kann.

Hier ist der Quelltext:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
        private void test1()
        {
            double strom = 0.0;
            int zustand = 0;


            for (int i = 0; i < 100; i++)
            {
                strom = Get_Current();
                if (strom > 0)
                {
                    zustand = (int)(strom * 5e6);
                    if (zustand >= 100) zustand = 100;
                    Abweichungpos1.Value = zustand;
                    Abweichungneg1.Value = 0;
                }
                else
                {
                    zustand = (int)(strom * -5e6);
                    if (zustand >= 100) zustand = 100;
                    Abweichungneg1.Value = zustand;
                    Abweichungpos1.Value = 0;
                }
            }
        }

Ich hoffe jemand kann mir das so "umschreiben" bzw. etwas dazuschreiben.
Währe dafür sehr dankbar.
MfG ReBeL

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Zuletzt bearbeitet von ReBeL1337 am Mo 25.02.08 14:10, insgesamt 1-mal bearbeitet
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 25.02.08 14:04 
Wenn ich das richtig sehe (interessant wäre die Methode Get_Current), brauchst du keinen Thread. Mit einem Timer sollte sich das genauso gut und vor allem einfacher lösen lassen.

PS: Umschließe Quelltext bitte mit den [cs]-Tags.
ReBeL1337 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 22



BeitragVerfasst: Mo 25.02.08 14:14 
user profile iconKhabarakh hat folgendes geschrieben:
Wenn ich das richtig sehe (interessant wäre die Methode Get_Current), brauchst du keinen Thread. Mit einem Timer sollte sich das genauso gut und vor allem einfacher lösen lassen.



Danke erstmal.
Was meinst du mit "interessant wäre die Methode Get_Current".
Geht das auch das ich den Timer während er läuft zu unterbrechen?

user profile iconKhabarakh hat folgendes geschrieben:
PS: Umschließe Quelltext bitte mit den [cs]-Tags.

Habe ich gerde nicht gefunden, ich hoffe das ist jetzt okay so.

MfG
maro158
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Mo 25.02.08 15:32 
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        BackgroundWorker worker = new BackgroundWorker();
        private void SetupBackgroundWorker()
        {
            worker.WorkerReportsProgress = true;
            worker.WorkerSupportsCancellation = true;
            worker.DoWork += new DoWorkEventHandler(worker_DoWork);
            worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
        }

        void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            double strom = 0.0;
            int zustand = 0;

            AbweichungsStatus status = (AbweichungsStatus)e.Argument;

            for (int i = 0; i < 100; i++)
            {
                strom = Get_Current();
                if (strom > 0)
                {
                    zustand = (int)(strom * 5e6);
                    if (zustand >= 100) zustand = 100;
                    status.pos1 = zustand;
                    status.neg1 = 0;
                }
                else
                {
                    zustand = (int)(strom * -5e6);
                    if (zustand >= 100) zustand = 100;
                    status.pos1 = zustand;
                    status.neg1 = 0;
                }
                worker.ReportProgress(0, status);
            }
        }

        private double Get_Current()
        {
            return 0.00;
        }

        AbweichungsStatus status = new AbweichungsStatus();
        void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            status = (AbweichungsStatus)e.UserState;
            this.textBoxPos1.Text = status.pos1.ToString();
            this.textBoxNeg1.Text = status.neg1.ToString();
        }

        void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
            { 
                //Do something
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            SetupBackgroundWorker();
            worker.RunWorkerAsync(status);
        }
    }

    public struct AbweichungsStatus
    {
        public int neg1;
        public int pos1;
    }
ReBeL1337 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 22



BeitragVerfasst: Mo 25.02.08 15:52 
Vielen lieben Dank maro158,

nur leider sollen das keine textbox sein sondern eine progressbar bzw. 2.
ich habe versucht das jetzt umzuschreiben aber dann mekert der rumm.

und ich habe noch eine frage dazu, läuft dieser backroundworker die ganze zeit? oder ist es möglich den ein einen step einzubinden? vieleicht dan einfach so:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
case 5:
                    Set_Voltage(0.0true);
                    panelVR4.Visible = false;
                    panelVR2.Visible = false;
                    panelVR1.Visible = true;
                    textBoxstep6.BackColor = Color.White;
                    textBoxstep5.BackColor = Color.DarkGray;
                    MessageBox.Show("Bitte Widerstand einschalten");
                    double Strom = Get_Current();                   
                    backroundworker(); <----------- ???
                    step += 1;
                    break;


Also dieser backroundworker soll dann abgerufen werden wenn man in diesem Step weitermacht, bzw. die message box mit ok bestätigt. Ginge das so?

MfG
ReBeL
maro158
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Mo 25.02.08 18:24 
Du kannst selbstverständlich statt den Textboxen andere Steuerelemente aktualisieren, aber nur aus dem UI-Thread.

In meinem Code-Beispiel habe ich Dir die allgemeine Arbeitsweise eines BackgroundWorker skizziert. Vielleicht noch einmal die einzelnen Schritte:

1. Einrichten des BackgroundWorkers (SetupBackgroundWorker()) im UI-Thread
2. Nichtblockierendes Starten des BackgroundWorkers (worker.RunWorkerAsync(status)) im UI-Thread, d.h. der Thread wird gestartet aber es wird nicht auf das Beenden der Ausführung gewartet
3. Asynchrone Ausführung des BackgroundWorkers (worker_DoWork(object sender, DoWorkEventArgs e)) im Worker-Thread
4. Bearbeitung der Rückmeldung vom BackgroundWorker im UI-Thread
5. Bearbeitung nach Beenden des BackgroundWorkers im UI-Thread

Wo und wann Du etwas in einem Hintergrundprozess ausführst, hängt ganz von Deiner Domänenlogik ab. Ich gehe davon aus, dass Du im BackgroundWorker Anweisungen stehen hast, deren Ausführung LANGE dauert und für diese Dauer den UI-Thread blockieren würde. Allerdings musst Du auf einige Dinge aufpassen:

a. Aus dem Worker-Thread ist keine direkte Aktualisierung der Steuerelemente im UI-Thread möglich (verwende dazu worker.ReportProgress zusammen mit dem entspr. Ereignis-Handler)
b. Der Zugriff auf gemeinsam genutzte Daten-Variablen muss mittels eines lock-Statments sauber gehalten werden
c. Wenn ein Ausnahme-Fehler im Worker-Thread ausgelöst wird, wird dieser nicht automatisch an den UI-Thread zurückgegeben, du kannst zwar e.Error überprüfen, aber das war's dann schon.
d. Bei "unsachgemäßer Verwendung" kann es zu Deadlocks kommen.

Nochmals, ich verstehe die Domänenlogik nicht, deshalb kann ich leider nicht konkreter in meinen Ausführungen sein.
ReBeL1337 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 22



BeitragVerfasst: Di 26.02.08 15:07 
Ich "glaube" das es jetzt funktioniert, aber um das richtig zu testen soll ich den in eine endlosschleife setzten.
Kann mir jemand verraten wie ich das machen soll?
Danke schonmal.

MfG
ReBeL1337 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 22



BeitragVerfasst: Mi 27.02.08 10:38 
Die obrige Frage hat sich erledingt.
Jetzt habe ich aber eine andere, wie beende ich einen backroundworker?
MfG
ReBeL
maro158
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Mi 27.02.08 13:05 
Im calling thread:

ausblenden C#-Quelltext
1:
backgroundWorker1.CancelAsync();					


Im worker thread z.B.:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
while(breakCondition == false)
{
  breakCondition = backgroundWorker1.CancellationPending;
  // Do something...
}
ReBeL1337 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 22



BeitragVerfasst: Mi 27.02.08 13:46 
Dankeschön, hat geklappt.