春节放假时有一天突然想到Qt是支持用Intel C++编译的,有icc的mkspec,而且Intel C++在Windows、Mac和Linux都有,还能生成32位和64位的可执行文件,于是就想试一下,如果确实可行,以后就不用GCC了,虽然GCC也很好。
比较囧的是,在Windows上,Intel C++除了最核心的编译器,其他的都是用Visual C++的,比如运行时,甚至包括nmake,于是很不幸的是nmake貌似不能通过命令行参数指定并行编译,只能单线程编译了,纠结。
自己编译Qt的话,Windows和Linux都要为32位和64位系统分别编译,Mac倒是只要编译一个就行了,但是有个小问题是上次在Mac OS X 10.6.7上编译Qt 4.8.0时64位版本到后面有个什么库没有,于是只能编译32位版本了,囧。
Tag Archives: Qt
嵌入的CLR引用销毁的C++对象的问题
今天彻底打酱油了,我们shared dev team也只剩下我,老大和Jason三个人了。因为晚上2点才睡,才睡了不到6个小时,于是下午就坐在办公椅上睡了近1个半小时,最后是被他们讨论一个bug的声音吵醒的,啊哈哈,老大还说让我看一下,现在只有我在这方面有经验了,我囧,我完全没经验的说,后来还是Sherman厉害啊!
再后来,就跟老大讨论了一会儿C++ singleton的实现,以及跨DLL数据引用等等。问题是有个Watson的bug,我从一次crash的call stack中发现,程序在调用_exit后,该程序中的static object应该是已经瞬间被无声息地干掉了,所谓无声息的,就是说,连它的析构函数都没被调用的。但这时嵌入的CLR还需要做一部分扫尾的工作,而恰恰是这扫尾工作又反过来调用了那个貌似已经被干掉的static object,于是程序crash了。当然这只是我的猜测,我猜测嵌入的CLR就是要生存周期长一点,于是一直在代码中试图找一下它是怎么从C++端嵌入CLR的,然后怎么用CLR的。我发现的情况貌似是这样的,先用Managed C++写了一个dll,这个dll可以在DllMain,还可以导出函数,而据我前些天才知道的知识,.NET编写的普通的DLL形式的assembly跟原本的DLL不一样,没有DllMain的。而这个DLL通过导出函数返回一个对象的指针,这个exe程序通过GetProcAddress获取导出函数,再调用这导出函数获取对象指针。这个返回的对象呢,是个CLR Bridge,也就是说,通过这个对象,可以从C++端创建CLR中的对象,调用CLR对象中的方法等等。也就是说,从代码中,我没看到Jeffray Richter在《CLR via C#》中说的那种CLR host的方法。现在我仍然在怀疑,是不是我代码没看全,但我确实之前也在整个代码目录下搜索文本,没有那几个用于host CLR的API调用。似乎有点跑题了。然后我就跟老大说了一下我发现的这些情况,略微讨论了一会儿,老大表示自己也不知道,唔,其实我也不指望他知道,只是有这么一种想跟人分享自己的发现的欲望而已。基本上,我就觉得这很可能是此bug的root cause了,但老大说可能只是个cause,而不是root cause,好吧,其实就是缺少验证而已。一个比较有说服力的验证方法是自己用C++写个小程序,然后用相同的方法调用CLR中的代码,最后能制造出同样的crash,只是我最近木有动力去做这些事而已。另外就是,即使确定了这是个root cause,简单地说来,这个root cause应该就是对象销毁的顺序不对,这是可以肯定的,但之后也不好fix,因为这个程序实在太庞大了,有很多对象,然后引用关系也很复杂,以我目前对它的了解程度,根本没能力对理顺这个关系,于是也就fix不了了。而且还有个另外的问题是,那个static object是该程序中用于实现singleton的一种方式,我觉得比较奇怪,老大说,这是为了应付多线程的情况。还有种应用多线程的singleton实现方式是在create instance时加锁,唔。关于这个话题,在前段时间看到TopLanguage group中有个讨论,提到boost中某个库中的singleton实现,貌似很干净的实现,不用锁,也不是static object,能适应多线程,囧,具体的不记得了,貌似boost中有好几个子库中都有自己的singleton的实现,得再去看看代码才行,另外好像《Modern C++ Design》里也有对多线程singleton实现的讨论,春节放假看看去。
话说,今天还看到Mono,发现除了有Mono Touch外还有Mono for Android,不过免费试用版都只能在emulator上跑,最便宜的个人版license也要399刀。不禁大骂Qt的不给力,为毛只能为Symbian和MeeGo用,Android port至今还在alpha 3,beta和rc都遥遥无期,更别说正式release了。而iOS port则压根貌似没人做了,叹气。我在想,如果Qt现在如果有Android和iOS的port像现在的Mono那么高的成熟度,我说不定真会去花这钱买license,囧!
从滑动手势谈到Qt
N9作为Nokia推出的唯一一部装载MeeGo系统的手机,主打宣传的是其滑动手势。
滑动手势在其他触摸屏设备上已经有所应用,各种移动操作系统也对其有一定的支持,但在N9上作为主推特性的滑动手势主要是基于Qt这个跨平台的开发框架实现的,因为从实现角度讲,N9装载的MeeGo系统的UI都是建立在Qt的基础之上的。
Qt自从被Nokia收购后,一直致力于在移动设备上的移植工作,尤其是对Symbian的支持越来越多。而MeeGo这个原本由Nokia和Intel合作开发的项目,同样做了很多跟Qt适配的工作。
Qt做了很多为方便实现触摸操作响应的工作,特别是后来推出的Qt Quick,彻底地让UI和业务逻辑分享。美工可以只使用非常简单的脱胎于JavaScript的声明式语言QML来构建UI,而程序员则可以专注于使用C++或JavaScript实现底层的业务逻辑。Nokia为QML提供了非常丰富的UI元素,还为Symbian系统特地实现了一组扩展的UI控件,这已经可以实现绝大多数的UI需求,各种UI元素又可以随意组合从而构建出更加复杂的应用。而且Qt还提供了多种QML与C++交互的机制,如果QML内建的UI元素不能满足实际需求,程序员可以用C++实现复杂的UI,而Qt本身又有基于CSS style sheet的UI方案和Graphics View的方案,这都让开发人员可以快速地制作出炫目的UI来。另外值得一提的是,基本上可见的QML UI元素,都为触摸操作甚至滑动手势提供了一定的支持,这从QML自带的Demo就可以看出来,不但需要的代码量非常少,而且做出的UI效果却非常时尚。
可以这么说,Qt推出Qt Quick这个方案,代表了应用程序开发的一个方向,快速制作精美UI的方向。基本上所有大的开发框架/解决方案都采用了类似的技术,比如微软的WPF,Mozilla的XUL,甚至Qt在开源界的长期竞争对手Gtk+也有类似的方案,即用简单的标记式、声明式的语言构建UI,减少美工们的学习负担和工作量,而使用其他功能强大、便于操控底层的语言实现业务逻辑。相比其他几个竞争对手,整体而言Qt的优势在于跨平台性好,配套的开发工具也一直在进步。但是它必然也有些缺点,比如一直以来Qt的运行效率不高,虽然Nokia收购后这在方面做了大量的努力;前不久Qt又回归了社区,Nokia成为了一个普通的贡献者,这也许会带来发展方向模糊,进度缓慢的问题,比如一直由开源社区在开发的Qt for Android的port,一年多了仍然没能正式发布。
总的说来,Qt是一个构建Windows、Linux、Mac OS X以及Symbian、MeeGo应用的低成本、高效率的解决方案。如果基于lighthouse机制的Android和iOS移植能尽快正式发布,那在普通消费型电子产品平台上,就真的如它的宣传语所说的Code Less, Create More, Deploy Everywhere了!
钱不够纸醉金迷,呜呜
作为纸醉金迷的生活的开始,随便在网上看了一下上海的景点列表,排在第一位的居然是上海科技馆,恰好我也知道它在某条地铁线上,于是就跑过去了。之前就听别人说过不好玩,去了之后才体会到到底不好玩到什么程度。60块门票实在太不划算了,6块钱才差不多。里面多数是小孩,以及带小孩子来的大人,像我这样的实在很稀奇。封杀之~
今天在公司里把AWD的第一部分快速过了一遍,明天继续看第二部分,争取这周把整本书都过一遍,达到可以用windbg完成基本的调试任务的目标。说到底,最终的目标是要能用windbg分析dump file的目的,虽然以前也做过这种事,但都是囫囵吞枣不求甚解的,这次有机会可以系统的学习下很有用。另外,我想在这公司里,估计以后回过头来看,最大的收获可能是英语的听读能力有大进步吧,可能写和说的能力也会有所提高吧,这将是我最高兴的事。
周末无聊,随便算了一下自己每月的固定开销,吓了一跳,居然这么高,这点工资收入实在不够看,要多久才能攒够买MBP的钱呢,昨天从上海科技馆出来后跑到陆家嘴的苹果专卖店,发现13寸的那款只要11498了,以前印象中是13998的呀,好心动,国庆后一定要入一个。也就是说,光靠这点工资的收入是远远不能支撑我日益膨胀的消费能力和消费欲望了,赚外快呀呀~
csdn上的Qt应用开发大赛奖品好少,不过E7很让我眼馋喵,还剩下一个半月,快速写几个程序试一把。先就已经提上计划好些日子的Aokiwen吧,豆瓣客户端,支持Win/Mac/Linux,以及Symbian。qDou其实已经做得不错了,不过它一开始就是为手机设计的,有些方面不是很舒服。握拳!
Nokia N9发布
今天突然在推上看到Nokia N9的消息。搭载了MeeGo 1.2版本,已经很新了。
下午收到了Qt Ambassador的邮件,邀请为N9开发app,还可以申请N950用于调试和测试。可以使用Qt为N9开发应用,对我来说,实在是欣喜,至少Ninayan要移植过去应该障碍很少了。
上官网看了一下大概的情况,官方指导价550欧,有点贵,不过它有3.9英吋的屏幕,而且看截图,真的有点心动。
感觉N9会是一个好玩具。
Ninayan W.I.P.(24)
实在有点不乐意做Deardawn,心理障碍克服不了啊。
Ninayan今天被小言一说,才发现真的是添加不了账号了,原来是之前一次为了加快启动速度的修改,把其他功能破坏掉了,不但添加不上账号,还一开始不能发布消息,只有在显示过home timeline后才可以。
提取了几个model类,这样的实现比较优雅。
几个singleton在程序退出时都正确销毁了。
把AutoProxy的gfwlist信息配置保存到sqlite数据库里了,可以记录每条规则的enable与否,hit次数。在每次程序退出时刷新这些信息到sqlite数据库里。
给几个本地数据库建了几个索引,这样可以让查询速度加快一点点吧。
由于占用内存比较厉害,在Windows下就用::EmptyWorkingSet每分钟清空一次工作集,其他平台不知道有什么类似的方案。但实际上在Windows下如果窗口最小化时,内存会被一下子回收好多,不知道到底是怎么回事的。
本地数据库读写冲突的问题还没想到比较低成本的解决方案,叹气。
停下来想想,现在已经实现的功能也只是玩玩而已,最有用的应该还是Google Reader支持吧,可惜没找到确认无误的API文档。
Ninayan W.I.P.(23)
blog被墙了就真不太想更新了。
Ninayan这段时间除了不时地发现些bug,然后修正外,主要是增加了对163、Sina、Sohu、QQ微博的支持。从开发者角度讲,163的API是最接近Twitter了,QQ的API设计最山寨,完全自己搞了一套,Sina和Sohu从技术角度讲跟QQ接近,接口设计仍然是模仿Twitter。
然后在google code上放了Linux版的可执行文件上去,今天才知道原来各发行版上普通的应用程序是可以做到二进制兼容的,也怪我以前看CodeLite、Code::Blocks它们都为每个发行版提供一个独立的安装包,就先入为主地以为每个发行版都要各自单独编译才行。今天突然想到Qt Creator就是同一个可执行文件在所有Linux发行版里可以运行,只是区分了32位和64位而已。我还傻乎乎地在12个系统里都编译了一把Qt,再分别编译出Ninayan,再分别打包,再分别上传,天呐!