Deadlock Appeared!

procedure TProducer.Execute; begin repeat if n=MAXN then self.Suspend else begin n:=n+1; WriteLn(‘Produced one item! n=’,n); if n=1 then cons.Resume; end; until false; end; procedure TConsumer.Execute; begin repeat if n=0 then self.Suspend else begin n:=n-1; WriteLn(‘Consumed one item! n=’,n); if n=MAXN-1 then prod.Resume; { GetItem; ConsumeItem; } end; until false; end; 运行一段时间之后,终于看见DeadLock了……Old Blog Link: http://computer.mblogger.cn/henryhu/posts/61832.aspx

Learning Java

从前有过一段时间看Java,但是没有坚持看完。现在有时间了,终于可以好好看了。正好我有个想了很长时间的项目没有做:我家的ADSL上网是限时的,每个月只有30小时,所以需要一个计时工具。但是网上找来的都要注册,用得很不爽。而且我同时要在FreeBSD和Windows下面计时,因此需要一个跨平台的,这样的网上就更加没有了…… 就一直打算用Java自己写一个,现在就当作顺便学习学习Java,练练手吧。家里有一本TSU(TUP)出版的《Java语言与面向对象程序设计》,二表哥读书时候留下的,就当作教材了。看得差不多之后,就开始做项目了。其实Java的语法等和C基本上是一样的,面向对象的部分让我感觉怎么和C#一模一样……(其实是C#和他一模一样……),觉得把System.out.println换成Console.WriteLine,把import …换成using …,就差不多了…………主要的新鲜部分是Java的各种系统类、各种控件类,还有——Java damn的控件布局方式! 很难直接指定位置,虽然这样对放大、缩小有好处,但是设计界面的时候,真是………… 控件主要是参考JBuilder的Help,比看书有效~现在在用JBuilder,这个是很早以前装着的不知道干什么用的~ 开始用一直有问题,光标在这里,按键却发现输入在后面几个字符的地方………… 琢磨一阵后发现:凡是有保留字(显示用的是粗体)的地方后面就会有这种情况,一个保留字就差一格,两个差两格…… 于是到选项里面把保留字的粗体显示给去掉…… 世界恢复正常了~ 真是怪事~JBuilder似乎自己也是用Java编的? 至少界面可以变成Java经典界面~ 用起来有点慢(Borland 9系列的东西似乎都这样……),易用性还是不错地(我特别喜欢那个Smart indent,的确非常Smart~)从下午写到晚上,差不多基本功能已经好了(历史纪录也好了),但是还不能监测网络情况,需要点击Button来表示连接/断开。Java也还行了~PS:JBuilder 9 的那个 Borland Look And Feel 比 Java 标准和 Windows 标准都漂亮多了~ 能整合进去多好~Old Blog Link: http://computer.mblogger.cn/henryhu/posts/61627.aspx

使用Winsock API发送/接收UDP包

其实Winsock这堆底层API和BSD都是一样的么…… 难怪令人怀疑这个是抄袭BSD的源代码……UDP比较简单,只要bind一下,RP好的话就可以发了。先 s: = socket(AF_INET,SOCK_DGRAM,0);成功的话,s已经是一个可以用的socket了。 然后要指明绑定的addrsa:sockaddr_in;fillchar(sa,sizeof(sa),0);sa.sin_family:=AF_INET;sa.sin_port:=htons(port);sa.sin_addr.S_addr:=inet_addr(PChar(address));address为地址(a.b.c.d形式),port为端口号。而htons作用是把以主机存储方式存储的port转换为网络上通用的port形式。 接着就可以bind了bind(s,sa,sizeof(sa));成功的话,netstat -an能够看见你所bind的端口号。 bind完了,这个socket和端口也就建立了联系,所有扔到这个口的UDP包都会给这个socket 接着可以直接用recv收。但是假如没有数据过来,程序就会卡在这里,多不好……所以用WSAAsyncSelect来指明当收到包之后给窗口发消息。WSAAsyncSelect(s,form1.Handle,WM_RECEIVED,FD_READ);WM_RECEIVED自己定义,FD_READ说明只关心收到消息。 接着让窗口收到这种消息的时候运行给定的proc先定义这个proc:Procedure TForm1.OnMyMessage(var Msg:TMsg;var Handled:Boolean);然后在FormCreate的时候告诉窗口:application.OnMessage:=OnMyMessage;这样就完了 收到消息后:  if Msg.message=WM_RECEIVED then(万一不是呢……)lParam的底字节代表具体情况(我们只关心FD_READ,所以这里只会是FD_READ)高字节为出错信息wParam为收到消息的那个socket,我们这里只有s,所以其实也一样然后就可以recv了recv(Msg.wParam,data,MAXMSG,0);不出意外,消息就在data里了~ 好好处理消息吧~ 记得最后closesocket(s)哦~ 以免资源浪费~   Old Blog Link: http://computer.mblogger.cn/henryhu/posts/61586.aspx

Google Earth 4 under FreeBSD

在 FreeBSD 下面用 Google Earth,实际上是 Linux 版,但是工作得还行,只是启动的时候报告字体没有,gtk 的样子也难看…… 但是实际效果是没有区别的,Google Earth 的功能日渐完善。上海的各个地方基本上都有清晰的照片了。比较有意思的是,原来我打算把FDFZ加入自定义地标并且传上去,结果传的时候,Google 给了个提示:你有没有打开社区贡献层,从而知道是否有人发过了? 我开开来一看,果然…… 似乎已经有两个了,比较好的是一个叫 WilliamShen 的ID发的,不知道是谁啊~Google Earth 还有了一个默认的景点列表,点 Play 之后能够自动游览世界各地~ 免费环游世界么~ powered by performancing firefox