WPF中UI及时更新

不管是在winform还是在WPF中,我们要做一个进度条,用在一个大循环或者一个耗时的处理中,首先想到的就是多线程。否则进度条会出现假死现象,进度条不会更新。做多线程是比较麻烦的,如果只是简单的更新UI,可以用Systems.DoEvents。

在winform中,使用PeekMessage处理完消息队列,使UI有机会更新。在WPF中,可以在Dispatch里使用PushFrame达到同样的效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void DoEvents()
{

DispatcherFrame frame = new DispatcherFrame();
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,
new DispatcherOperationCallback(delegate(object f)
{


((DispatcherFrame)f).Continue = false;

return null;
}
), frame);
Dispatcher.PushFrame(frame);
}

写了这个方法后,我们在循环中或者事件中,在需要更新的UI后面调用一下DoEvents()就可以了。

C#进程控制示例-sqlserver的停止与启动

当我们在对sql server进行复制,重命名,移动,删除操作时,由于系统将sql服务开启,所以无法直接进行操作,需要将服务停止,操作完成之后再重新开启。停止与开启的方法可以利用SQL Server Management Studio,还可以在cmd下使用net start/stop mssqlserver。在C#程序中,为了方便对sql服务的开关,可以用以下两种方法:

方法一:利用C#执行cmd语句net start/stop mssqlserver。此方法就不详细叙述了。

方法二:利用进程控制。

先添加引用

阅读更多

你必须知道的C#的25个基础概念

原作者:reonlyrun

1.静态变量和非静态变量的区别?

静态变量: 静态变量使用 static 修饰符进行声明 在所属类被装载时创建 通过类进行访问 所属类的所有实例的同一静态变量都是同一个值 非静态变量: 不带有 static 修饰符声明的变量称做非静态变量 在类被实例化时创建 通过对象进行访问 同一个类的不同实例的同一非静态变量可以是不同的值

2.const 和 static readonly 区别?

const 用 const 修饰符声明的成员叫常量,是在编译期初始化并嵌入到客户端程序 static readonly 用 static readonly 修饰符声明的成员依然是变量,只不过具有和常量类似的使用方法:通过类进行访问、初始化后不可以修改。但与常量不同的是这种变量是在运行期初始化

阅读更多

WPF的bmp和二进制转换

bmp转二进制:

1
2
3
FileStream fs = File.OpenRead(filepath); //filepath文件路径
Byte[] tempBuff = new Byte[fs.Length];
fs.Read(tempBuff, 0, tempBuff.Length);

二进制还原bmp:

1
2
3
4
5
BitmapImage BI = new BitmapImage();
BI.BeginInit();
BI.StreamSource = new MemoryStream(bufPic); //bufPic是图片二进制,byte类型
BI.EndInit();
image_emp.Source = BI;//image_emp是图片控件

BMP格式分析

C#下将BMP转换成二进制是比较容易的,方法如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
byte[] bufPic;
string filePath = "";
Stream myStream;
MemoryStream picFile = new MemoryStream();
OpenFileDialog open = new OpenFileDialog();
open.Filter = "bmp files (*.bmp) | *.bmp";
open.RestoreDirectory = true;
if (open.ShowDialog() == DialogResult.OK)
{
if ((myStream = login.OpenFile()) != null)
{
myStream.Close();
}
}

filePath = open.FileName.ToString();
Image image = Image.FromFile(filePath);
image.Save(picFile, ImageFormat.Bmp);
bufPic = picFile.GetBuffer();

其实转换的结果是以8位二进制分割的十进制数(0~255),若是真要得到纯二进制,还需要进一步转换。我曾做过很多实验,目的是测试这些数字和图片本身之间的关系,虽然学习过多媒体技术,但是对于详细的bmp分解,并没有太多认识。当然,在实验前还要把”二进制”还原bmp的方法说明一下:

1
2
3
4
5
6
7
8
using (MemoryStream ms = new MemoryStream(myPic))
{
Image image1 = Image.FromStream(ms);
ms.Close();
pic.Image = image1;
}

//其中mypic是byte类型,存放"二进制"的数组,pic是PictureBox控件

实验1: 人为的变动bufPic数组中的前几个位置,得到的结果都是出错,没能正确的还原回bmp,仔细观察后在发现,几乎所有的bmp转换成的bufPIc的前几个位置都相同,所以得到一个猜测:bmp文件不是单一的由图片的像素组成,还有一些默认的统一的”约定”

阅读更多

ADO.net存取image类型

最近试验需求,用到了sql server中的image字段,存取方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void Save()
{
using (System.IO.FileStream stream = new System.IO.FileStream())
{
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, (int)stream.Length);
stream.Close();
string strName = System.IO.Path.GetFileNameWithoutExtension(file);
SqlCommand cmd = new SqlCommand("Insert into Temp(name,photo) values(@name,@image)", sqlConn);
cmd.Parameters.Add("@name", SqlDbType.VarChar).Value = strName;
cmd.Parameters.Add("@image", SqlDbType.Image).Value = buffer;
cmd.ExecuteNonQuery();
}
}

取:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void GetImage()
{
SqlCommand cmd = new SqlCommand(@"SELECT name, photo FROM Temp", sqlConn);
sqlConn.Open();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
image_filename = (string)reader.GetValue(0);
byte[] image_bytes = (byte[])reader.GetValue(1);
MemoryStream ms = new MemoryStream(image_bytes);
Bitmap bmap = new Bitmap(ms);
return bmap;

}
}
阅读更多

混沌序列

最近做信息安全方面的项目,看到一些关于混沌变换的论文,总结一番。

关于混沌

如果一个系统的演变过程对初始的状态十分敏感,就把这个系统称为是混沌系统。

在1972年12月29日,美国麻省理工教授、混沌学开创人之一E.N.洛仑兹在美国科学发展学会第139次会议上发表了题为《蝴蝶效应》的论文,提出一个貌似荒谬的论断:在巴西一只蝴蝶翅膀的拍打能在美国得克萨斯州产生一个龙卷风,并由此提出了天气的不可准确预报性。至此以后,人们对于混沌学研究的兴趣十分浓厚,今天,伴随着计算机等技术的飞速进步,混沌学已发展成为一门影响深远、发展迅速的前沿科学。

混沌来自于非线性动力系统,而动力系统又描述的是任意随时间变化的过程,这个过程是确定性的、类似随机的、非周期的、具有收敛性的,并且对于初始值有极敏感的依赖性。而这些特性正符合序列密码的要求。19**Robert Matthews在Logistic映射的变形基础上给出了用于加密的伪随机数序列生成函数,其后混沌密码学及混沌密码分析等便相继发展起来。混沌流密码系统的设计主要采用以下几种混沌映射:一维Logistic映射、二维He’non映射、三维Lorenz映射、逐段线性混沌映射、逐段非线性混沌映射等,在本文中,我们主要探讨一维Logistic映射的一些特性。

阅读更多

凯撒密码(一)

  “恺撒密码”据传是古罗马恺撒大帝用来保护重要军情的加密系统。(即今天我们所说的:替代密码)

  它是一种代换密码,通过将字母按顺序推后起3位起到加密作用,如将字母A换作字母D,将字母B换作字母E。据说恺撒是率先使用加密函的古代将领之一,因此这种加密方法被称为恺撒密码。

  假如有这样一条指令:

  明文(小写):ji xiao jing

  用恺撒密码加密后就成为:

阅读更多

凯撒密码(二)

上篇显示了用错误的key得到了错误的结果,现在使用正确的key

这样就得到了正确的结果。

当然,这个程序只是演示凯撒密码的一个思路,没有对其他符号加密,这样有个很严重的后果,就是很key容易被破解。

举例:(key是*不告诉你,嘿嘿)

阅读更多

C#网页自动填表自动登录

自动填表的方式有很多,关键是获取控件的id或者name。

比如源代码有

1
<input id="pwdInput" tabindex="2" class="ipt-t" type="password" name="password" onMouseOver="fEvent('mouseover',this)" onFocus="fEvent('focus',this)" onBlur="fEvent('blur',this)" onMouseOut="fEvent('mouseout',this)"/>

那么就可以用

1
2
3
4
5
6
7
8
9
10
HtmlDocument doc = webBrowser1.Document;
foreach (HtmlElement em in doc.All)
{
string str = em.Id;
if (str == "pwdInput")
{
em.SetAttribute("value", "abc"); break;

}
}
阅读更多