• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak wyświetlać dane w sposób ciągły

Object Storage Arubacloud
0 głosów
403 wizyt
pytanie zadane 15 lipca 2015 w Mikrokontrolery przez daniel89 Użytkownik (700 p.)

Witam.

Jak zrobić , aby program ciągle odczytywał dane i je odświeżał w Visual C# , oto kod który tylko przy starcie podaje wartość temperatury a potem nic. Zależy mi aby samoczynnie się odświeżał nie klikając na żaden button . Chciałem dać pętle while , ale program nie chce startować .. Jak to zrobić ? Oto kod który do tej pory mam (Chodzi o metodę txttemperatura() , Progrm odczytuje dane z Serial Monitor i je wyświetla w Label , ale tylko przy starcie a ma ciągle odświeżać samoczynnie ;p ) : 

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;
using System.IO.Ports;

namespace Arduino
{
    public partial class Form1 : Form
    {
      

 private SerialPort myport;

 
        public Form1()
       {
          
           
               InitializeComponent();
               init();

               txttemperatura();
           
            
        }

        private void on_bttn_Click(object sender, EventArgs e)
        {
            myport.WriteLine("N");
            on_bttn.Enabled = false;
            off_btn.Enabled = true;
        }
      private void init()
        {
            try
            {
                myport = new SerialPort();
                myport.BaudRate = 9600;
                myport.PortName = "COM5";
                myport.Open();
                myport.DtrEnable = true;


            }
            catch (Exception)
            {
                MessageBox.Show("Error");
            }
            on_bttn.Enabled = true;
            off_btn.Enabled = false;

        }

  
        

        private void off_btn_Click(object sender, EventArgs e)
        {
            myport.WriteLine("F");
            on_bttn.Enabled = true;
            off_btn.Enabled = false;
        }


        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            if (myport.IsOpen)
                myport.WriteLine(trackBar1.Value.ToString());
            label4.Text = "Wartosc = " + trackBar1.Value.ToString();
            
        }

        private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
        {
            if (myport.IsOpen)
                myport.WriteLine(vScrollBar1.Value.ToString());
            label4.Text = "Wartosc = " + vScrollBar1.Value.ToString();
        }





      private void txttemperatura()
        {
            if (myport.IsOpen)
           {
             
                   
                   string temperatura = myport.ReadLine();
                   txttemp.Text = temperatura + "°C";

                   
               
                
           }

      }

 

        
      
    }
}

 

3 odpowiedzi

+1 głos
odpowiedź 15 lipca 2015 przez niezalogowany

Ale kombinujecie. Bindowanie danych - tylko kwestia wybranej technologii - WPF, a tutaj dla WinForms

komentarz 15 lipca 2015 przez daniel89 Użytkownik (700 p.)
Z tego bindowania to ja nic nie kumam teraz .
komentarz 15 lipca 2015 przez niezalogowany

Ogólny zamysł jest taki, że tworzysz ŹRÓDŁO danych i łączysz je z wybraną kontrolką, która w momencie, kiedy w źródle zachodzi zmiana - aktualizuje się.

Tutaj łap linki bezpośredno ze źródła:

1. WPF

2. W przypadku WinForms masz klasę Binding

W WPF będzie wygodniej.

komentarz 15 lipca 2015 przez daniel89 Użytkownik (700 p.)

podasz jakiś przykład tego ? dla np. pobrania ciągu znaków i połączenia z label o nazwie txttemp ?


string temperatura = myport.ReadLine();
              txttemp.Text = temperatura + "°C";
komentarz 15 lipca 2015 przez niezalogowany

Masz wszystko dokładnie opisane w drugim linku (z przykładem włącznie). Skup się na tej funkcji (ale przejrzyj cały przykład, żebyś złapał kontekst).

​protected void BindControls()
   {
      /* Create two Binding objects for the first two TextBox 
         controls. The data-bound property for both controls 
         is the Text property. The data source is a DataSet 
         (ds). The data member is the  
         "TableName.ColumnName" string. */
      text1.DataBindings.Add(new Binding
      ("Text", ds, "customers.custName"));
      text2.DataBindings.Add(new Binding
      ("Text", ds, "customers.custID"));

      /* Bind the DateTimePicker control by adding a new Binding. 
         The data member of the DateTimePicker is a 
         TableName.RelationName.ColumnName string. */
      DateTimePicker1.DataBindings.Add(new 
      Binding("Value", ds, "customers.CustToOrders.OrderDate"));

      /* Add event delegates for the Parse and Format events to a 
         new Binding object, and add the object to the third 
         TextBox control's BindingsCollection. The delegates 
         must be added before adding the Binding to the 
         collection; otherwise, no formatting occurs until 
         the Current object of the BindingManagerBase for 
         the data source changes. */
         Binding b = new Binding
         ("Text", ds, "customers.custToOrders.OrderAmount");
      b.Parse+=new ConvertEventHandler(CurrencyStringToDecimal);
      b.Format+=new ConvertEventHandler(DecimalToCurrencyString);
      text3.DataBindings.Add(b);

      // Get the BindingManagerBase for the Customers table. 
      bmCustomers = this.BindingContext [ds, "Customers"];

      /* Get the BindingManagerBase for the Orders table using the 
         RelationName. */ 
      bmOrders = this.BindingContext[ds, "customers.CustToOrders"];
   }
komentarz 15 lipca 2015 przez daniel89 Użytkownik (700 p.)
próbuje to zrozumieć , ale nie kumam , chyba za mało się nauczyłem do tej pory . Obiektowe kursy przeglądałem , ale tutaj to jest czarna magia dla mnie .

próbowałem podmienić text1 na txttemp , ale dalej jeszcze inne dane nie wiem skąd do czego i jak xd

nie można tego jakoś prościej zrobić ? tak dla początkującego aby ogarnął ?
0 głosów
odpowiedź 15 lipca 2015 przez Dorion300 Szeryf (90,250 p.)
edycja 15 lipca 2015 przez Dorion300

Może nowy wątek "Thread" (albo "Task") który jest zapętlony i odświeża non stop?

Polecam go umieścić na stacie programu nie w buttonie, gdyż za każdym kliknięciem zaczniesz tworzyć nowy wątek i zasyfisz zasoby komputera.

https://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx

https://msdn.microsoft.com/pl-pl/library/system.threading.thread(v=vs.110).aspx

 

Prosty przykład tworzenia nowych wątków:

using System;
using System.Text;
using System.IO;
using System.Threading;

namespace TestMode
{

	public class MainClass
	{

		public void Wontyk()
		{
			while (true) {
				Console.WriteLine ("kliknij Dowolny przycisk aby zamknąc program");
			}
		}

		public static void Main ()
		{

			new Thread (new ThreadStart (Wontyk)).Start ();
			Console.ReadKey ();
			Environment.Exit (0);

		}
	}
}

 

komentarz 15 lipca 2015 przez daniel89 Użytkownik (700 p.)

public static void Main () nie mogę dodać bo błąd wywala . jak daje sam public void Main () to nic to nie robi , chyba że źle to wrzuciłem do kodu oto część dodanego kodu : 

using System.Threading;
using System.IO;

public void Wontyk()
      {
          while (true)
          {
              string temperatura = myport.ReadLine();
              txttemp.Text = temperatura + "°C";
          }
      }
      public void Main ()
      {
          new Thread(new ThreadStart(Wontyk)).Start();
          Environment.Exit(0);
      }

 

komentarz 15 lipca 2015 przez Dorion300 Szeryf (90,250 p.)
To był przykład tylko jak tworzenie wątków wygląda, nie rozwiązanie.
komentarz 15 lipca 2015 przez daniel89 Użytkownik (700 p.)
No to co w kodzie trzeba zmienić aby na tym drugim wątku ciągle odświeżało tą temperaturę ? I czy na pewno to jest dobry pomysł ?
komentarz 15 lipca 2015 przez Dorion300 Szeryf (90,250 p.)
edycja 15 lipca 2015 przez Dorion300

W sumie to bindowanie jest lepszym pomysłem. (Co kolega ZlapZabijIZakop napisał)

Ale dam ci fragmet kodu, może zadziała.

Dopisz jeszcze "using System.Threading.Tasks;"

		private void txttemperatura()
		{
			if (myport.IsOpen)
			{

				Task k = new Task(delegate()
					{
						while(true)
						{
							string temperatura = myport.ReadLine();
							txttemp.Text = temperatura + "°C";
						}
					}
				
				);
				k.Start();
			}
		}

 

komentarz 15 lipca 2015 przez daniel89 Użytkownik (700 p.)
Wiesza się z tym kodem, tylko powtarzam nie mogę użyć static . chyba jednak nici z moich chęci ;p
komentarz 15 lipca 2015 przez Dorion300 Szeryf (90,250 p.)
A to usuń static, przypadkowo dodałem. wybacz za prosty błąd.

Poprawiłem już kod.
komentarz 15 lipca 2015 przez daniel89 Użytkownik (700 p.)
bez static też się wiesza ;p
0 głosów
odpowiedź 20 lipca 2015 przez Patryk Procyk Nowicjusz (140 p.)

Możesz użyć klasy DispatcherTimer, która w pewnym interwale czasu będzie odświeżać Label ;)
 


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;
using System.IO.Ports;
 
namespace Arduino
{
    public partial class Form1 : Form
    {
       
 
 private SerialPort myport;
 DispatcherTimer Timer = new DispatcherTimer();
  
        public Form1()
       {
           
            
               InitializeComponent();
               init();
 
               txttemperatura();
               Timer.Tick += Timer_Tick;
               Timer.Interval = TimeSpan.FromSeconds(0.1);
             
        }
        private void Timer_Tick(object sender, EventArgs e)
        {

txttemperatura();
       }
        private void on_bttn_Click(object sender, EventArgs e)
        {
            myport.WriteLine("N");
            on_bttn.Enabled = false;
            off_btn.Enabled = true;
        }
      private void init()
        {
            try
            {
                myport = new SerialPort();
                myport.BaudRate = 9600;
                myport.PortName = "COM5";
                myport.Open();
                myport.DtrEnable = true;
 
 
            }
            catch (Exception)
            {
                MessageBox.Show("Error");
            }
            on_bttn.Enabled = true;
            off_btn.Enabled = false;
 
        }
 
   
         
 
        private void off_btn_Click(object sender, EventArgs e)
        {
            myport.WriteLine("F");
            on_bttn.Enabled = true;
            off_btn.Enabled = false;
        }
 
 
        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            if (myport.IsOpen)
                myport.WriteLine(trackBar1.Value.ToString());
            label4.Text = "Wartosc = " + trackBar1.Value.ToString();
             
        }
 
        private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
        {
            if (myport.IsOpen)
                myport.WriteLine(vScrollBar1.Value.ToString());
            label4.Text = "Wartosc = " + vScrollBar1.Value.ToString();
        }
 
 
 
 
 
      private void txttemperatura()
        {
            if (myport.IsOpen)
           {
              
                    
                   string temperatura = myport.ReadLine();
                   txttemp.Text = temperatura + "°C";
 
                    
                
                 
           }
 
      }
 
       
    }
}

 

Podobne pytania

+1 głos
1 odpowiedź 542 wizyt
0 głosów
2 odpowiedzi 281 wizyt
pytanie zadane 7 sierpnia 2018 w PHP przez szwarceneger Nowicjusz (170 p.)
0 głosów
2 odpowiedzi 207 wizyt

92,615 zapytań

141,465 odpowiedzi

319,779 komentarzy

61,997 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...