Autor Beitrag
heinz_m
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 01.01.09 11:47 
Ich bin gerade an den ersten Lernschritten in visual C#.
Wenn ich den folgenden Code ausführe und den StoppKnopf anklicke, reagiert
beim ersten Mal der Startknopf und erst beim zweiten Mal der Stoppknopf. Mit
den beiden MessageBox Anweisungen funktioniert es korrekt, wenn sie
auskommentiert sind, jedoch nicht.
Das Programm sollte die Farbe des Formulars ändern, bis der StoppKnopf
gedrückt wird. (Siehe "C# von Kopf bis Fuss", Seite 75 ff)

??

ich wünsche allen ein glückliches Neues Jahr

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:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace kbf_76
{
    public partial class Form1 : Form
    {
        bool farbeAendern = true;
        public Form1()
        {
            InitializeComponent();
           
        }

        private void Startknopf_Click(object sender, EventArgs e)
        {
            //MessageBox.Show("StartKnopf gedrückt");
            farbeAendern = true;
            while (farbeAendern)
            {
                
            
                for (int c = 0; c < 255 && farbeAendern; c++)
          {
                    this.BackColor = Color.FromArgb(c, 255 - c, c);
                    System.Threading.Thread.Sleep(3);
                    Application.DoEvents();
                   
          }
                for (int c = 255; c >= 0 && farbeAendern; c--)
                {
                    this.BackColor = Color.FromArgb(c, 255 - c, c);
                    System.Threading.Thread.Sleep(3); 
                    Application.DoEvents();
                    
                }
            }
        }

        private void StoppKnopf_Click(object sender, EventArgs e)
        {
            farbeAendern = false;
            //MessageBox.Show("StoppKnopf gedrückt");
        }
    }
}


Moderiert von user profile iconUGrohne: C#-Tags hinzugefügt


Zuletzt bearbeitet von heinz_m am Fr 02.01.09 22:33, insgesamt 1-mal bearbeitet
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 01.01.09 12:23 
Hallo Heinz und :welcome:

Bitte sorge zunächst dafür, dass Dein Code als solcher erkennbar ist: Rufe Deinen Beitrag auf, mit der Schere auf "überarbeiten", die "Bereiche" öffnen, Code-Text markieren, den Plus-Button drücken, geänderten Text "absenden". Bitte achte auch auf korrekte Einrückungen.
ausblenden C#-Quelltext
1:
2:
// so soll Code aussehen:
private void MyButtonClick(object sender, EventArgs e) { ... }

Bitte erkläre auch noch ausdrücklich, was Du willst, denn bei Deinem unlesbaren Code kann ich das nicht erkennen: Soll es sich um eine Änderung handeln, die einmal ausgeführt werden soll und dann bis zur nächsten Änderung erhalten wird; oder soll es eine kontinuierliche Änderung sein, die bis zum Stopp immer weiterläuft?

Ist Dir klar, dass Sleep sich auf jeweils 3 Millisekunden bezieht? Die minimale Reaktionszeit von Windows beträgt normalerweise 52 msec.

Gruß und Frohes Neues Jahr! Jürgen
miniC#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Wiin XP Home
C# VS Express 2008
BeitragVerfasst: Do 01.01.09 14:05 
bissi ulkig gestrickt alles.anbei ein kleines beispiel. ein timer für die steuerung und ne halbgare schleife fürs farbpingpong. ich habe zwar selbst nicht viel ahnung, aber einen thread anzuhalten, der auch die gui für dein programm führt, halte ich für nicht so eine gute idee. ich denke, wenn du unbedingt den thread.sleep nutzen willst , dann solltest du hier mal im forum nach dem thema suchen , da gab es grade einige threads dazu (hahah !!!).

hab dir schon bissi code gefaltet , zu faul zum suchen :)

frohes neues,
miniC#

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:
using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private Timer _timer;
        private Random _r;
        private int[] _rgb;
        private int[] _rgbstep;
        public Form1()
        {
            InitializeComponent();
            DoubleBuffered = true;
            _r = new Random();
            _rgb = new int[3] { 018975 };
            _rgbstep = new int[3] { 111 };
            _timer = new Timer();
            _timer.Interval = 5;
            _timer.Tick += new EventHandler(this._timer_tick);
        }

        private void _timer_tick(object sender, EventArgs e)
        {
            BackColor = _setcolor(BackColor);
        }

        private Color _setcolor(Color c)
        {
            for (int i = 0; i < 2; i++)
            {
                if (_rgb[i] == 255)
                    _rgbstep[i] = -1;
                if (_rgb[i] == 0)
                    _rgbstep[i] = 1;
                _rgb[i] += _rgbstep[i];
            }

            return Color.FromArgb(255, _rgb[0], _rgb[1], _rgb[2]);
        }

        private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            if (_timer.Enabled) _timer.Enabled = false;
            else _timer.Enabled = true;
        }

    }
}

_________________
Zitat MDSN : " ... C# (gesprochen: "si scharp") " :D
heinz_m Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 01.01.09 20:24 
Titel: Erläuterung
Herzlichen Dank für die Hinweise zur Nutzung des Forums.

Das Programm sollte die Hintergrundfarbe des Fensters so lange dauernd verändern, bis der StoppKnopf gedrückt wird.

Mich erstaunt, dass der Startknopf reagiert, wenn ich den Stopknopf drücke.

Gruss

Heinz
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 01.01.09 20:52 
Das wäre in der Tat merkwürdig :gruebel: . Könntest du die erzeugte Exe hochladen?

_________________
>λ=
heinz_m Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 02.01.09 00:01 
Titel: und die Setup.exe
damit Ihr seht, was sich da tut


:o
Einloggen, um Attachments anzusehen!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 02.01.09 00:29 
One-Click-Anwendungen sind zwar nett, aber kannst du nicht einfach die Exe selbst (in \bin\Debug) hochladen :shock: ? Vor allem fehlen da ein paar Dateien.

_________________
>λ=
heinz_m Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 02.01.09 10:59 
Titel: und die exe
ich hoffe, das hilft. Danke für die Geduld.
Einloggen, um Attachments anzusehen!
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Fr 02.01.09 11:34 
Hallo Heinz,

bei mir reagieren Start- und Stopp-Button wunschgemäß. Allerdings dauert es immer wieder etwas, bis ein Button reagiert. Das hängt vermutlich mit der seltsamen Art der Thread-Konstruktion zusammen, wie schon miniC# sagte.

Gruß und Frohes Neues jahr! Jürgen
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 02.01.09 14:29 
Ich kann das reproduzieren, habe aber keine Ahnung woran das liegt, dazu kenne ich C# nicht gut genug. :nixweiss:

Im Anhang ein Video, in dem man das sieht. Ich klicke erst auf Start, dann nur noch auf Stopp (zweimal, beim ersten Mal bewegt sich stattdessen Start).
Einloggen, um Attachments anzusehen!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 02.01.09 14:35 
Bei mir zeigt sich ein ähnliches Problem: Wurde der Startknopf gedrückt, reagiert der Stopknopf erst beim zweiten Klick, mit Tab+Space funktioniert es dagegen. Da hat die WinAPI wohl Probleme, einen zweiten Klick zu verarbeiten, wenn der erste noch gar nicht beendet wurde.
/Edit: Wohl das gleiche Phänomen wie bei jaenicke

Die einfachste Lösung dürfte ein Timer sein, vielleicht sinkt dadurch die Frequenz aber ein wenig.

_________________
>λ=
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 02.01.09 15:09 
Nicht die Windows API hat damit ein Problem, .NET hat ein Problem damit :!:
Im Anhang die exakt identisch umgesetzte Demo in Delphi, das funktioniert.

Und hier der ebenfalls nicht funktionierende Quelltext von VB .NET (gleiches Problem):
ausblenden 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:
Public Class Form1
    Private farbeAendern As Boolean

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        farbeAendern = True
        Dim c As Integer
        While farbeAendern
            For c = 0 To 254
                BackColor = Color.FromArgb(c, 255 - c, c)
                System.Threading.Thread.Sleep(3)
                Application.DoEvents()
            Next
            For c = 254 To 0
                BackColor = Color.FromArgb(c, 255 - c, c)
                System.Threading.Thread.Sleep(3)
                Application.DoEvents()
            Next
        End While
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        farbeAendern = False
    End Sub
End Class
In .NET muss man das also anders lösen. Zum Beispiel mit einem richtigen Thread. (Oder einem Timer, ja.)
Einloggen, um Attachments anzusehen!
heinz_m Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 02.01.09 22:29 
Titel: Danke !
Ich bedanke mich herzlich bei allen, die sich um meine Frage gekümmert habe. Dass ich mit einem meiner ersten C# Vesuche, gleich .NET überlistet zu haben scheine, löst bei mir allerdings etwas gemischte Gefühle aus.
Auf jeden Fall werde ich in Zukunft mit Threads vorsichtiger umgehen.

Meine Frage war auch ein Test, wie aktiv das Forum ist und ich bin begeistert.

Grüsse

Heinz
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 02.01.09 22:36 
Titel: Re: Danke !
user profile iconheinz_m hat folgendes geschrieben Zum zitierten Posting springen:
Dass ich mit einem meiner ersten C# Vesuche, gleich .NET überlistet zu haben scheine, löst bei mir allerdings etwas gemischte Gefühle aus.
Nicht gerade überlistet, es ist nur nicht vorgesehen auf diese Weise eine Parallelisierung zu erreichen. ;-)

Andere dafür vorgesehene Alternativen mögen am Anfang schwieriger erscheinen, aber zumindest ein Timer ist es nicht so sehr. Und mit echten Threads musst du dich vielleicht am Anfang etwas mehr beschäftigen, aber dafür funktioniert es dann auch und ist sauber programmiert. ;-)
mberle
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 03.01.09 17:12 
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:
public partial class Form1 : Form  
    {  
        bool farbeAendern = true;  
        public Form1()  
        {  
            InitializeComponent();  
            StoppKnopf.Enabled = false;
        }

        private void Startknopf_Click(object sender, EventArgs e)  
        {  
            Startknopf.Enabled = false;
            StoppKnopf.Enabled = true;
            //MessageBox.Show("StartKnopf gedrückt");  
            farbeAendern = true;  
            while (farbeAendern)  
            {  
                  
              
                for (int c = 0; c < 255 && farbeAendern; c++)  
          {  
                    this.BackColor = Color.FromArgb(c, 255 - c, c);  
                    System.Threading.Thread.Sleep(3);  
                    Application.DoEvents();  
                     
          }  
                for (int c = 255; c >= 0 && farbeAendern; c--)  
                {  
                    this.BackColor = Color.FromArgb(c, 255 - c, c);  
                    System.Threading.Thread.Sleep(3);   
                    Application.DoEvents();  
                      
                }  
            }  
        }  

 
        private void StoppKnopf_Click(object sender, EventArgs e)  
        {  
            Startknopf.Enabled = true;
            StoppKnopf.Enabled = false;
            farbeAendern = false;  
            //MessageBox.Show("StoppKnopf gedrückt");  
        }  
    }


Hallo,

ich lerne ebenfalls mit dem Buch "Von Kopf bis Fuß". Ich habe mal eine Möglichkeit ergänzt damit das Programm zumindest so funktioniert wie es soll. - Wahrscheinlich nicht sehr elegant, aber ein Workaround.