2010-05-29 177 views
2

余米添加自定义的控制,我FlowLayoutPanel的,它的某种外汇的数据,每秒刷新一次,自定义控件属性 - C#,窗体

等各个计时器滴答,即时通讯增加一个控制,改变控制按钮上的文字,随后将其加入为FlowLayout面板,

IM在每100毫秒计时器滴答做,

它占用过多的CPU,

这里是我的自定义控制。

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(); 
    }  

这里是我如何添加控制;

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(); 
    } 
} 

现在它在每次发送时都发送10次,占我Core2Duo CPU的60%。 我想刷新快,我需要一些优化建议

是否有任何其他的方式,我可以只添加控件第一次,然后更改自定义的文本控件上的每个刷新或计时器滴答上运行按钮

即时通讯使用c#.net

+0

请不要在SO上复制/粘贴代码而不要格式化。这太可怕了。请在SO上张贴之前检查拼写。谢谢 – abatishchev 2010-05-30 14:59:27

回答

0

它发生10次,因为你告诉它。

在第二

有1000毫秒,如果你正在做的每100ms,那么你在执行动作10次。


好的,这里有一些事情正在进行。首先,您需要为要更新的各种控件维护一个处理程序或名称。这可以通过定义的对象或使用FINDCONTROL(“ControlName”)来完成。

现在,针对您在访问控制器时遇到的问题,这是由于THREADS造成的! Timer_Elapsed事件中的代码发生在一个单独的线程中,因此,要影响UI,您需要使代码线程安全。

考虑这些对象:

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

然后你必须执行的实际变化

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

,然后在单独的线程,通过

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

它应该是在同一时间,外汇数据被换款如此之快,我需要做的计时器, 我想这个问题问的是, 我怎么能,第一次添加控件, 上 然后每次打勾,只需更改我的自定义控件中的按钮文本,就会大量优化代码, 有没有可用的解决方案?我可以访问在运行时添加的cutom控件,并更改属性。 – kawafan 2010-05-29 13:48:13

+0

^ 使这个定时器类外是一个还是老样子prblem,怎么我不知道从行从resposnse返回API的数量, 也可能是2-20, 如果不知何故,我itialize他们定时器事件外, 即时通讯仍然无法访问这样的控制 _userControl.btnlay1.Text = xxx – kawafan 2010-05-29 14:10:00

1
调用此方法

为了多次访问控件,您需要使变量的作用域大于勾号方法。查看使其成为类变量的示例。您也可以将控件构造函数放在窗体构造函数中,然后tick方法只会改变数据。

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

使这个以外的计时器类是stil一个问题,因为我不知道从api返回从resposnse返回的行数,它可能是2 -20,如果我以某种方式将它们在计时器事件之外重新启用,im仍然无法像这样访问控件_userControl.btnlay1.Text – kawafan 2010-05-29 21:32:01