22. august 2009 - 22:31Der er
24 kommentarer og 1 løsning
int imellem funktioner
Jeg har en class med funktioner, hvor positionerne for de forskellige servoer er registeret
namespace ServoController { public class ServoControl { //Positions of servos stored here public int channel00 = 750; //som udgangangspunkt er positionen center, som er 750
//herefter kommer funktionen som sender en ny position til servoen, og som samtidig sætter channel00, med den nye position
public string SetServo(int channel, int ramp, int position, string function) { if (channel == 0) { channel00 = position; } } } }
I min anden fil har jeg så dette
namespace SamplePlugin { public partial class SamplePluginForm : Form { //ikke relevant kode klippet ud, hvor der bla bliver startet en timer
Mit problem her er så at det timeren får tilbage, er de 750 som jeg har sat første gang. Og ikke det som SetServo sætter den til. Hvad er det jeg gør forkert?
SetServo bliver kaldt hver gang der kommer en kommando ind som fortæller hvad der skal flyttes, og hvor meget. SetServo får det så behandlet, og sendt ud til Serial porten.
Timeren som tjekker den int, er sat til 1000
efter at SetServo har udført en handling, retunerer den dette
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using SamplePlugin; using System.IO.Ports; using System.IO; using System.Net; using ServoController;
namespace SamplePlugin { public partial class SamplePluginForm : Form { ServoControl sc = new ServoControl(); //Set instance for the ServoControl class
public SamplePluginForm(bool haveLicense, string owner) { InitializeComponent(); }
Næsten det eneste tænkelige der sker ... og da jeg hjalp dig i går, kunne jeg forstå på dig at du var ny ... derfor jeg næsten er sikker på at du 2 steder i dit program opretter en instance af din klasser ... altså:
Servo s1 = new Servo(); Servo s2 = new Servo();
s1.SetServo(100);
s2.GetServer();
s2 indeholde stadig default værdien, men s1 indeholder 100
Men til sådan get/set operationer burde du kigger på properties i .NET
Har fundet dette, det må være den 10-2 Accessing Class Fields With Properties
Men jeg forstår ikke hvordan det på nogen måde skulle passe ind.
Så skal jeg for hver værdi t channel/ramp/position/function oprette en private og en public? Men så er det hele jo også i den forkerte fil? Kan ikke få det til at give nogen mening. :(
Hvis det virker med static ... så er det fordi det ikke er samme object du arbejder med i dit program, men har oprettet 2 instances af den samme klasse ... som vi har sagt fra start.
Hvis du vil have løsning på hvordan du kan få det til at virke uden static skal du enten poste din kode eller sørge for at det er den samme instance du arbejde med og ikke hele tiden opretter en ny.
Hvis du kommer ud i et multithread miljø, er det ikke smart at bruge static og tror det generelt set er bad practice at gemme ting i static variabler.
Men hvis det virker så er det jo godt. Men vil dog anbefale dig at arbejde på samme object ... for din egen skyld ... debug er noget rod mange static variabler.
Hver gang ServoControl.Channel00 ændres, bliver progress-baren opdateret. Super nemt, og enkelt.
[code] 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 E { class ServoControl : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged;
private int _channel00;
public int Channel00 { get { return _channel00; } set { if(value != _channel00) { _channel00 = value; PropertyChanged(this, new PropertyChangedEventArgs("Channel00")); } } }
public string SetServo(int channel, int ramp, int position, string function) { if(channel == 0) { Channel00 = position; }
return ""; } }
public partial class Form1 : Form { private ServoControl sc = new ServoControl();
public Form1() { InitializeComponent();
sc.PropertyChanged += new PropertyChangedEventHandler(sc_PropertyChanged);
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 E { class ServoControl : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged;
private int _channel00;
public int Channel00 { get { return _channel00; } set { if(value != _channel00) { _channel00 = value; PropertyChanged(this, new PropertyChangedEventArgs("Channel00")); } } }
public string SetServo(int channel, int ramp, int position, string function) { if(channel == 0) { Channel00 = position; }
return ""; } }
public partial class Form1 : Form { private ServoControl sc = new ServoControl();
public Form1() { InitializeComponent();
sc.PropertyChanged += new PropertyChangedEventHandler(sc_PropertyChanged);
--> "Singleton er yderst yderst sjældent den "helt rigtige" måde at løse problemer på!"
Sådan som jeg har forstået koden/hardware'en (uden egentlig at have set ret meget af den), så skal ServoControl altid pege på de samme servoer, igennem den samme serielport.
I den situation er Singleton pattern den "helt rigtige" måde at gøre det på.
> I den situation er Singleton pattern den "helt rigtige" måde at gøre det på.
Ikke når han ikke har flere instanser? Og hvis man bare vil skrive en række statiske metoder kan man jo bare lave en statisk klasse.
Umidbart giver en servo-controller per server jo fint mening? Men selvom man har flere, så er server-controlleren jo en "observer" som jeg ser det, derfor vil en løsning med Observer være bedre end noget roderi i singleton.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.