Archive for the ‘3-开发 Develop’ Category

解决.NET应用程序效率问题

.NET应用程序一直以开发速度快、IDE功能强大作为卖点,理所当然我这种智商不高又期望快速开发的人当然首选它了。第一次尝试用.NET做整个机床的控制程序,平台不是太强大,赛扬2.4的CPU和512的内存,基本上够跑。经历两个多月的开发把底层的功能基本完善了,控制台程序看不出效率的问题,我很放心的使用WINDOWS FORMS完成剩下的界面。

当做到一定程度的时候,效率问题就逐步显现出来了,GUI界面很缓慢,令人很抓狂。在尝试了很多的方法和优化后,最终还是要到及床上进行实际的调试。昨天忙了一天,终于找到了问题所在。过程我就不详细多说了,解决问题最根本的还是找准了病根。

有时候我们可能想WINDOWS FORMS的GUI性能不太好,界面刷新老是很缓慢,比起MFC的程序有时候慢很多。当然这里有一些GUI库的问题,我们只能从另外的一面去优化。但其实微软已经做的够好,而很大程度上取决于我们怎么使用它。

找病根,有两种方法:一种是庸医所用的乱证乱下药,偶尔有效;一种是西医的科学化的方法,用数据说话。在当了一阵庸医以后,终于想尝试用工具来解决问题。

Resharper很可能很多人都用过吧,JetBrains公司还有一款产品用于性能分析的——dotTRACE。此工具比VS自带的性能测试工具好用多了。我用这个工具详细一测,立刻就找到了病根所在。当然选择正确的测试模式还是很有必要的,由于我开得多线程,所以需要用针对线程的测试模式,才能测得线程中函数调用的时间。

真是一针见血,找到了问题所在,立刻解决问题。

最后总结一下:

1、不要盲目找问题,要找到工具来,用数据说话。

2、.NET GUI库有一些小的方面有性能问题(比如DataGridView等控件,但其实用好了速度还是很快的),但不足以影响到正常的工作,很多时候都是自己用法没对造成的。

学会状态机,事半功倍

关于状态机,请参考BOB大叔的敏捷软件开发一书。书上介绍了一个状态机编译器,SourceForge上有一个开源的更完整的版本:http://smc.sourceforge.net/

使用状态机可以完成很多事情,更多关于状态机的应用由于最近太忙了,就没法写了,多GOOGLE一下:)

如何在Form中使用方向键

其实很简单,之前我还用钩子函数来解决,其实根本没必要。重写Form的方法就可以了。

[csharp]
const int WM_SYSKEYDOWN=260;
const int WM_KEYDOWN=256;

protected override bool ProcessCmdKey(ref Message msg,Keys keyData)
{
if ((msg.Msg==WM_KEYDOWN)||(msg.Msg==WM_SYSKEYDOWN))
{
switch (keyData)
{
case Keys.Up:
MessageBox.Show("up");
break;
case Keys.Down:
MessageBox.Show("down");
break;
case Keys.Left:
MessageBox.Show("left");
break;
case Keys.Right:
MessageBox.Show("right");
break;
}
}
return true;
}
[/csharp]

补充:经实验此法仅能提取到KEYDOWN信息,而KEYUP信息被“吃”了,所以有些需要KEYUP事件的东西就不能做了。

最终在CodeProject找到一个类来处理这个事情,很方便:http://www.codeproject.com/KB/cs/globalhook.aspx

虚拟手术DEMO

我用OSG做的虚拟手术的演示,虽然很粗糙,但也能够实现下面的功能了:

  • 实现从影像设备上采集到DICOM格式的影像数据的功能。
  • 实现从采集到的DICOM格式中提取相关数据,转换为虚拟手术系统内部格式的功能。
  • 实现DICOM数据的2D显示功能,完成重采样、去噪点等图像学算法以提高图像质量。
  • 实现图像的2D和3D分割,完成区域生长、Snake算法等的研究,实现仅需要少量人工介入就能将病变组织自动提取的功能。
  • 实现了对感兴趣的组织进行标注和分离,并能够建立实时的3D立体模型。
  • 重点研究和实现了高质量的实时光线追踪算法的三维重建算法,在此基础之上,研究出了如何将该算法和常规的光栅渲染图形进行混合的方法。
  • 掌握了基于组织的三维立体切割方法。
  • 掌握了真三维立体显示的关键技术,使最终的成像不局限于显示器的平面2D环境,达到一种触手可及的感受,具有很强的立体效果和沉溺感。

目前用OSG来做我看已经到了一种无法收场的局面了, Read more

python:整数转换为任意进制(<=36)

javascript提供了一个number.toString(baseNum)的函数,能够将number转换为36进制以下的字符串。
python里面仅提供了将字符串转换为整数的函数,并没有提供相应的函数将整数转换为任意进制的字符串的函数(如果有的话,请告诉我一声)。在网上找到了答案Read more

OpenCASCADE 6.3.0编译出错的解决方法

在Linux下编译OpenCASCADE 6.3.0,出现:

g++ -DHAVE_CONFIG_H -I. -I. -I../../.. -I../../../inc -I../../../drv/EDL -I../../../src/EDL -I../../../drv/MS -I../../../src/MS -I../../../drv/WOKAPI -I../../../src/WOKAPI -I../../../drv/WOKBuilder -I../../../src/WOKBuilder -I../../../drv/WOKDFLT -I../../../src/WOKDFLT -I../../../drv/WOKDeliv -I../../../src/WOKDeliv -I../../../drv/WOKMake -I../../../src/WOKMake -I../../../drv/WOKOBJS -I../../../src/WOKOBJS -I../../../drv/WOKOrbix -I../../../src/WOKOrbix -I../../../drv/WOKStep -I../../../src/WOKStep -I../../../drv/WOKTools -I../../../src/WOKTools -I../../../drv/WOKUnix -I../../../src/WOKUnix -I../../../drv/WOKUtils -I../../../src/WOKUtils -I../../../drv/WOKernel -I../../../src/WOKernel -DNDEBUG -DNo_Exception -O2 -g -m32 -march=i586 -mtune=i686 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -ffriend-injection -fpermissive -DCSFDB -DOCC_CONVERT_SIGNALS -DLIN -DLININTEL -D_GNU_SOURCE=1 -O2 -MT WOKUnix_FDescr.lo -MD -MP -MF .deps/WOKUnix_FDescr.Tpo -c ../../../src/WOKUnix/WOKUnix_FDescr.cxx -fPIC -DPIC -o WOKUnix_FDescr.lo
../../../src/WOKUnix/WOKUnix_FDescr.cxx: In member function 'void WOKUnix_FDescr::Dup()':
../../../src/WOKUnix/WOKUnix_FDescr.cxx:249: warning: ignoring return value of 'int dup(int)', declared with attribute warn_unused_result
../../../src/WOKUnix/WOKUnix_FDescr.cxx: In member function 'Handle_TCollection_HAsciiString WOKUnix_FDescr::ReadLine()':
../../../src/WOKUnix/WOKUnix_FDescr.cxx:355: warning: ignoring return value of 'char* fgets(char*, int, FILE*)', declared with attribute warn_unused_result
../../../src/WOKUnix/WOKUnix_FDescr.cxx: In function 'FILE* _wokunix_fdopen(int)':
../../../src/WOKUnix/WOKUnix_FDescr.cxx:436: warning: deprecated conversion from string constant to 'char*'
../../../src/WOKUnix/WOKUnix_FDescr.cxx:443: warning: deprecated conversion from string constant to 'char*'
../../../src/WOKUnix/WOKUnix_FDescr.cxx:449: warning: deprecated conversion from string constant to 'char*'
In function 'int open(const char*, int, ...)',
inlined from 'WOKUnix_FDescr WOKUnix_FDescr::BuildNamedPipe()' at ../../../src/WOKUnix/WOKUnix_FDescr.cxx:205:
/usr/include/bits/fcntl2.h:51: error: call to '__open_missing_mode' declared with attribute error: open with O_CREAT in second argument needs 3 arguments
make[3]: *** [WOKUnix_FDescr.lo] Error 1
make[3]: Leaving directory `/home/anubis/src/rpm/BUILD/OpenCASCADE6.3.0/ros/adm/make/TKWOK'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/home/anubis/src/rpm/BUILD/OpenCASCADE6.3.0/ros/adm/make'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/anubis/src/rpm/BUILD/OpenCASCADE6.3.0/ros'
make: *** [all] Error 2

注意函数体BuildNamedPipe出错。在论坛上找到解决方案

只需要修改ros/src/WOKUnix/WOKUnix_FDescr.cxx的205行为:

myFileChannel = open(apath.ToCString(), O_RDONLY | O_NDELAY | O_CREAT, S_IRUSR);

即可

在Linux下开发Python S60程序初步——连上手机

今天突然想起来了,以前在Windows里面可以用超级终端链接通过蓝牙连接手机,但在Linux下面怎么做呢?做个笔记:
sdptool add --channel=10 SP
while true; do rfcomm listen /dev/rfcomm0 10; done

# On the cell phone, Open "Bluetooth Console" in Python menu and
# choose the Linux PC as the machine to connect to
#
# Once the phone is connected, open another terminal and type

screen /dev/rfcomm0

输入后会出现以下字样: Read more

VS2005编译完成缓慢

今天把虚拟机的系统换成了WinXP,Win2000系统确实有些问题,不得以而为之。但很令人费解的是项目编译的时候总是很慢,每次都是在编译完成的最后一刹那停住了,然后要等几秒钟才能缓过气来。以前编译控制台项目都没有遇到过这样的问题。逐步排除后才发现,原来只要打开过Windows Forms编辑器,就会造成编译缓慢。

回想以前用C++/CLI做东西的时候,就是感觉IDE特别的缓慢,竟然这下弄C#工程也遇到了这个问题。网上搜索一番没有发现解决方法。后来经过试验,只要把解决方案关掉,在打开,就OK了。如果再次打开了Windows Forms编辑器,又会变慢,真是郁闷。

再谈WinIO初始化异常

前段时间WinIO在我的新项目中总是初始化失败,有时候又是好好的,很让人费解。修改了源代码显示了很多调试信息后,也没有什么太多的收获。由于我们的工控卡必须要用这个库,所以没办法,只得停下脚步,细细研究一下问题所在。 Read more

C#工控

晚上终于完成了数控钻床Excellon格式的钻床文件的初步解析,能够将文件中的钻孔信息提取出来。另外还做了一个GUI工具,使数据能够可视化的显示出来。这周的任务也就暂告一段落,下周要去厂里面调试,这是我写的C#版本的第一个测试。

说来这个数控钻铣床项目在一开始还真是一波三折,最开始厂家说的是要的是一个支持Win98的版本, Read more

Return top