一个应用程序:
1、需要周期性获取三种远程数据,且获取周期不同
2、在程序的主界面对数据进行及时更新设计:
1、主界面UI线程独立(用户操作)
2、更新界面的线程Tup独立(定时更新UI界面)
3、三种数据用三个独立的后台线程去定时获取,获取的数据放在三个全局的栈gStack供UI线程取值更新主界面
线程函数用类似的代码:
while(true){sleep(T); doSomething();}
doSomething的主要工作是:获取远程数据,将数据入全局的栈
4、更新界面的线程Tup从gStack取出当前值进行界面更新(treeview,listview的加载)
5、为保持不完整数据造成异常,在三个后台进程对gStack的操作代码和Tup对gStack的操作代码处,使用Lock同步主要目的,大量数据更新界面控件耗时,后台取数据所用时间不定,所以使用多线程。各位高手,看看设计还有什么需要优化改进的地方。
1、需要周期性获取三种远程数据,且获取周期不同
2、在程序的主界面对数据进行及时更新设计:
1、主界面UI线程独立(用户操作)
2、更新界面的线程Tup独立(定时更新UI界面)
3、三种数据用三个独立的后台线程去定时获取,获取的数据放在三个全局的栈gStack供UI线程取值更新主界面
线程函数用类似的代码:
while(true){sleep(T); doSomething();}
doSomething的主要工作是:获取远程数据,将数据入全局的栈
4、更新界面的线程Tup从gStack取出当前值进行界面更新(treeview,listview的加载)
5、为保持不完整数据造成异常,在三个后台进程对gStack的操作代码和Tup对gStack的操作代码处,使用Lock同步主要目的,大量数据更新界面控件耗时,后台取数据所用时间不定,所以使用多线程。各位高手,看看设计还有什么需要优化改进的地方。
解决方案 »
- C# 中对INI文件读写
- 大家认为在winform中嵌入WPF控件这种开发形式如何?
- 怎样重构多鼠标事件
- pda(mc3000)连接sql2000调试能连,部署后运行出现sqlexecption异常,参与者有分
- c#代码问题哈`
- 关于SOCKET的问题,急求
- 我就纳了闷了!为什么C#操作数据库总是要绑定!!
- 为什么socket在局域网内可以,在广域网就不行?
- 请问这种方式的连接效果在Winform里怎么实现?
- C#上传文件到FTP服务器的问题,提示:应 PASV 命令的请求,服务器返回了一个与 FTP 连接地址不同的地址
- 在桌面开发中,在Page_Load方法之前执行的是什么方法?
- 图片缩略图生成的问题?
初学.net,请多多指教。
第2步:如果大量数据添加到控件,让主线程跑的话,会顿住的吧
没有stack的话,假设Tup尚未更新完成取回来的数据,后台取数据的线程恰好到了更新时间,这样会不正确吧后台取回的数据在array数组中,而且每次取回的元素个数不一定,这样直接在Tup用Arrry数组的话,会有问题吧(两个线程中的Array不是指向同一内存地址)谢谢您的回复
UI用Winform, 线程Tup定义和调用一定要在Winform之外
这是什么意思呢能具体说说么
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace WindowsApplication228
{
public partial class Form1 : Form
{
ListBox LB = new ListBox(); int T1Count = 0;
int T2Count = 0;
int T3Count = 0; public Form1()
{
InitializeComponent(); LB.Parent = this;
LB.Dock = DockStyle.Fill; new Thread(new ThreadStart(T1)).Start();
new Thread(new ThreadStart(T2)).Start();
new Thread(new ThreadStart(T3)).Start();
} static Object Obj = new Object(); void AddText(String Text)
{
lock (Obj)
{
LB.Items.Add(Text);
LB.SelectedIndex = LB.Items.Count - 1;
this.Text = T1Count.ToString() + " " + T2Count.ToString() + " " + T3Count.ToString();
}
} void T1()
{
int Start = Environment.TickCount; while (true)
if (Environment.TickCount - Start > 500)
{
this.Invoke(new Action<String>(AddText), new Object[] { "1-" + ++T1Count }); Start = Environment.TickCount;
}
} void T2()
{
int Start = Environment.TickCount; while (true)
if (Environment.TickCount - Start > 1000)
{
this.Invoke(new Action<String>(AddText), new Object[] { "2-" + ++T2Count }); Start = Environment.TickCount;
}
} void T3()
{
int Start = Environment.TickCount; while (true)
if (Environment.TickCount - Start > 1200)
{
this.Invoke(new Action<String>(AddText), new Object[] { "3-" + ++T3Count }); Start = Environment.TickCount;
}
}
}
}
利用委托更新UI,初学C#,我的理解是这样:
委托就是一个函数指针(增加了类型等安全检查的函数指针),几个线程使用这个相同的代码块,
本质上委托相当于另一个线程,独立于UI主线程的,所以可以实现不阻塞主线程界面操作的效果
这样理解正确么,谢谢