概述
1日 周五
1、测试在linux不同版本下程序能否正常运行 完成
2、协助现场部署程序 完成
3、处理现场的出现的问题 完成
4、学习js
windows调用程序启动一个进程的时候,有时候会出现问题。打出来日志调用的是unsafeNativeMethod,可能与线程安全有关。在程序中设置让进程不以shell的形式启动,问题就解决了。但是不以shell的形式启动,批处理命令timeout会显示控制台倒计时,现在的解决方法是,如果直接启动一个程序,那么就设置shell属性为false,如果是bat的话,就设置为true,但这应该不是最好的解决方法。查了查也没有查到想要的答案,先标记上,以后留意。
_______________________________________________________________________________________________________
4日 周一
好像最近新接了个项目,听起来有点意思,什么脑电波啥玩意。明天看一看怎么个搞法。正好凑着这个机会看看能不能加到那个项目里,熟悉熟悉跟互联网有关的项目。
_______________________________________________________________________________________________________
5日 周二
1、处理程序中的问题
2、解决缺陷
3、 明确新项目负责的模块
4、学习完JS的基础
windows使用批处理启动程序的时候,如果路径含有中文,需要转换为ANSI编码格式,具体做法是用记事本打开批处理,文件——另存为,编码改成ANSI,这样就可以正常执行了。
看来昨天是想多了,并不是想象中的那种项目。不过给分配的任务量也不小,里面还有好多细节需要实现,明天上午争取把手头上的缺陷问题全部解决掉,尽快转向新任务。
今天凑巧注意到虚函数这块,记得以前写JAVA的时候直接重写方法就可以了,没有使用virtual修饰,就查了查写不写的区别。还真有不同,JAVA默认是virtual修饰的,只不过给省略了,所以直接重写就可以了。C#的话,动物 A = 狗 B;动物中如果有一个virtual修饰的函数,那么编译器会去检查 狗 类里面是否有这个函数的重写方法,如果有就使用派生类里重写的方法,如果没有就向上寻找。但是如果动物类的函数不加virtual修饰,其派生类无法使用override重写该方法。比如说Class A 有个方法 public void Say(),Class B : A, 在B中也定义一个方法 public void Say(),如果使用A a = new B() ;a.Say()调用的是A中的Say(),B b = new B ()调用的则是B中的Say(),在这一点上需要加以注意,如果是希望基类的方法可以被重写,需要virtual进行修饰。我的理解是定义虚函数就是为了重写一个具体的实现方法,和抽象函数的功能是不同的。
8月份刚招来的一个应届生辞职了,想想确实,还不到三个月,就安排出差了3次,在外面时间加起来一个多月了,一个研发干工程的活,本身工资也不高,第一次的报销到现在还没下来,说上个月发到手2000,工资全还花呗了,一点不剩,让他怎么留啊,哎。问了问是裸辞,跟我当时是一样,不过他还没签合同,应该还算是应届生,希望他这几天好好休息休息,调整下心情,找个更合适的企业吧。
_______________________________________________________________________________________________________
6日- 11日 周三---周一
明天差不多就完工了,今天测试了一下能实现功能,明天全面跑一遍看看是不是还存在BUG。也给领导说了辞职的事情,干到这个月底就走。余下的十几天把剩下的工作处理处理,顺便找找有没有合适的工作。
_______________________________________________________________________________________________________
12日-15日
上线之后客户很满意,结果福建下面县级的供电公司也想要这个功能,只能再改了。
18日
周五改完后放在测试机上跑着,有三天了吧,能一直运行,不会出现进程终止的异常,Log日志中也没有打出Exception。应该是没有什么问题了,再持续监视一阵子。
总结一下这个项目中遇到的问题和个人的体会:
1、首先我感觉前期和客户沟通一定要做好,这次一开始是只要泉州相关的信息,后来上线刚一天,客户就要求其他城市的也要。导致又得切换另一种思路来实现,虽然不困难,但是如果一开始沟通好了,就不需要做一些无用功了。
2、拿到设计文档后,先根据文档设计整体实现流程和细节。这次一开始犯了错误,认为功能很简单,所以只是大致看了一下就开始做,导致前两天遇到了很多一开始没想到的问题,后来仔细分析了客户需求,设计了实现的流程草图并及时和领导沟通,发现了其实里面的处理逻辑也挺复杂的。根据修改后的设计草图来开发,最终提前完成了功能。
当拿到开发任务时,不要着急立马去做,先分析一下应该怎么去实现,有没有更好的方法。一开始多花一个小时思考,后面会减少半天甚至一天的开发量。
3、Winform中的datagridview这次用的比较多,感觉还是挺万金油的。不仅能做显示还可以随意修改,一开始想找看看能不能在datagridview中设置combox,但是没找到。程序中是用双击事件来实现的低配版combox的功能,用户在一行双击,该行第一个cell的value就会变成“排除”,再双击就会切换回“包含”,上线后找到了一个网址,说是可以实现在datagridview中设置combox,https://www.haolizi.net/example/view_20390.html 我暂时还没实践,不过看贴的图片确实是可以。今天抽空试一试。
这个网站需要积分下载。。不过里面给了部分代码,看了看代码,里面有DataGridViewComboBoxColumn这么一个对象,搜了搜才发现DataGridView里居然可以直接设置Combox。。。我傻了
4、对于新开的一个单独线程,如果是循环执行的话,最好不要重复New新的对象,一开始没有注意,新的线程中每执行一次就new一个新DBManager,运行了一个多小时后,程序就崩溃了。把它放在while循环外,程序正常运行。现在已经四天了。新线程可以简写为
new Thread(delegate(){
// Thread.CurrentThread.IsBackground = true; // 设置为后台线程
// 线程要执行的内容
}.start();
一般需要将该线程设置为后台线程,如果不设置为后台的话,主窗口关闭了它不受影响会接着运行。如果想让该线程休眠,直接在相应的地方写Thread.Sleep(600000); 睡眠的只是这个线程,对其他不会有影响。
5、如果一个函数可能返回Null的话,一定要在接受它返回值的地方判断一下非空,否则运行中如果返回null值的话,直接 .方法或者.属性的地方会报错。
6、主界面使用的是timer1绑定一个事件,来实现某个功能。打开一个另一个窗口,timer1停掉,关闭该窗口,timer1恢复。本次做法是设置全局变量Form1 form;在 private void XX_Click(object sender, EventArgs e) 中, form = new Form1(); form.show();
timer1.stop();
关闭时恢复timer1的方法:新建一个timer2,绑定事件
private void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (form.IsDisposed)
{
this.Invoke(new Action(() => { timer1.Start(); }));
// this.Invoke(new EventHandler(delegate { timer1.Start(); }));
timer2.Stop();
}
}
如果直接使用timer1.start();不会生效,可能因为timer2用的是System.Timers.timer,不是界面线程,所以需要调用委托的方法来把该委托传给界面线程来执行。中间两种都可以实现。
7、注册机功能的实现。
原理也很简单,这里就是通过获取当前机器的Mac地址,通过MD5加密,具体加密方法可以自行设置。在初始化程序前检测配置项中的注册码,如果正确就可以启动,不正确启动不了。
整体步骤是:现场运维人员首先获取机器Mac地址发回来,这边用加密方法生成一串注册码发给现场,现场在配置项中把注册码配置进去。程序内部每次启动时先获取电脑mac地址,再根据加密方法生成的注册码和配置项中的进行比较,如果相同,就正常启动。
8、其他的一些细节就不一一写出来了。个人还是比较喜欢做开发这一块的,挺锻炼逻辑思维能力。而且有好多东西一开始不懂的比如面向对象,委托……现在自然而然的就明白了,当然还需要继续深入了解。
_______________________________________________________________________________________________________
19日-20日
今天碰到程序崩掉了,Log里没有输出相应的信息,后来查了查程序才发现一个新的线程虽然是在一个try catch里面,但是这个线程内部并没有try catch块,导致异常不会抛出。对于新的线程,一定要在内部加上try catch块捕获异常。改完之后重新部署上,再观察是否还有其他问题。
最后
以上就是野性外套为你收集整理的2019年11月的全部内容,希望文章能够帮你解决2019年11月所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复