2010-05-29 6 views
2

I m ajouter un contrôle personnalisé à mon FlowLayoutPanel, son une sorte de données forex, rafraîchir chaque seconde,Propriétés des contrôles personnalisés - C#, les formulaires

donc à chaque tick timer, im ajout d'un contrôle, en changeant le texte du bouton de commande, puis l'ajouter à FlowLayout panneau,

im le faire à chaque tick timer 100ms,

il prend trop de CPU,

voici mon contrôle personnalisé.

public partial class UserControl1 : UserControl 
{ 
    public void displaydata(string name, string back3price, string back3, string back2price, string back2, string back1price, string back1, string lay3price, string lay3 , string lay2price, string lay2, string lay1price, string lay1) 
    { 
     lblrunnerName.Text = name.ToString(); 

     btnback3.Text = back3.ToString() + "\n" + back3price.ToString(); 
     btnback2.Text = back2.ToString() + "\n" + back2price.ToString(); 
     btnback1.Text = back1.ToString() + "\n" + back1price.ToString(); 

     btnlay1.Text = lay1.ToString() + "\n" + lay1price.ToString(); 
     btnlay2.Text = lay2.ToString() + "\n" + lay2price.ToString(); 
     btnlay3.Text = lay3.ToString() + "\n" + lay3price.ToString(); 
    }  

et voici comment ajouter un contrôle;

private void timer1_Tick(object sender, EventArgs e) 
{ 
    localhost.marketData[] md; 

    md = ser.getM1(); 

    flowLayoutPanel1.Controls.Clear(); 

    foreach (localhost.marketData item in md) 
    { 
     UserControl1 ur = new UserControl1(); 
     ur.Name = item.runnerName + item.runnerID; 
     ur.displaydata(item.runnerName, item.back3price, item.back3, item.back2price, item.back2, item.back1price, item.back1, item.lay3price, item.lay3, item.lay2price, item.lay2, item.lay1price, item.lay1); 

     flowLayoutPanel1.SuspendLayout(); 
     flowLayoutPanel1.Controls.Add(ur); 
     flowLayoutPanel1.ResumeLayout(); 
    } 
} 

maintenant son happing sur 10 fois sur chaque envoyer, en prenant 60% de mon CPU Core2Duo. je veux rafraîchir rapidement, j'ai besoin des conseils d'optimisation

est-il une autre façon, je peux juste ajouter des contrôles première fois, puis modifier le texte de la coutume des boutons contrôle sur l'exécution sur chaque tick de rafraîchissement ou d'une minuterie

Im utilisant C# .Net

+0

Veuillez ne pas copier/coller le code sur SO sans effectuer de formater. C'était horrible. S'il vous plaît vérifier l'orthographe avant de poster sur SO.Merci – abatishchev

Répondre

0

cela se produit 10 fois par seconde parce que vous le dites.

il y a 1000ms dans une deuxième

si vous le faites tous les 100ms, vous effectuez l'action 10 fois par seconde.


Bon, il y a quelques choses qui se passent ici. Tout d'abord, vous devez gérer un gestionnaire ou un nom pour les différents contrôles à mettre à jour. Cela peut être fait soit via un objet défini, soit en utilisant FINDCONTROL ("ControlName"). Maintenant, pour votre problème avec l'accès au contrôle dans le contrôle de la minuterie, c'est à cause de THREADS! Le code à l'intérieur de l'événement Timer_Elapsed se produit sur un thread séparé, ainsi, pour influer sur l'interface utilisateur, vous devez sécuriser votre thread de code.

Tenez compte de ces objets:

// The declaration of the textbox. 
private TextBox m_TextBox; 
public delegate void UpdateTextCallback(string text); 

Ensuite, vous auriez une méthode qui effectue le changement réel

// Updates the textbox text. 
private void UpdateText(string text) 
{ 
    // Set the textbox text. 
    m_TextBox.Text = text; 
} 

Et puis dans votre thread séparé, appelez cela via

m_TextBox.Invoke(new UpdateTextCallback(this.UpdateText), new object[]{”Text generated on non-UI thread.”}); 
+0

il devrait être dans le même temps, les données de forex est chaging donc je rapide besoin de le faire comme la minuterie, la question que je veux poser est comment je peux, Première Ajouter des contrôles, puis sur chaque tick, il suffit de changer le texte des boutons dans mon contrôle personnalisé, il permettra d'optimiser fortement le code, y at-il une solution disponible? que je peux accéder au contrôle cutom qui est ajouté à l'exécution, et modifier les propriétés. – kawafan

+0

^ ce qui en fait en dehors de la classe Timer est Stil un prblem, coz je ne sais pas le nombre de lignes qui reviennent de resposnse de api, il pourrait être 2-20, si en quelque sorte je les itialize en dehors de l'événement programmé, je ne suis toujours pas en mesure d'accéder à la commande comme ceci _userControl.btnlay1.Text = xxx – kawafan

1

Pour accéder au contrôle plusieurs fois, vous devez agrandir la portée de la variable méthode de la tique Voir l'exemple de la rendre une variable de classe. Vous pouvez également placer le constructeur du contrôle dans le constructeur du formulaire, puis la méthode tick ne fonctionnera que pour modifier les données.

public MyForm : Form 
{ 
    private UserControl _userControl = null; 
    ... 
    private void timer1_Tick(object sender, EventArgs e) 
    { 
     if (_userControl == null) 
      //make control 
     //set control data 
    } 
} 
+0

en faisant cela en dehors de la classe timer est encore un problème, car je ne connais pas le nombre de lignes revenant de resposnse d'api, il pourrait être 2 -20, si d'une façon ou d'une autre, je les isialise en dehors de l'événement timer, je n'arrive toujours pas à accéder au contrôle comme ceci _userControl.btnlay1.Text – kawafan

Questions connexes