Chinaunix首页 | 论坛 | 博客
  • 博客访问: 84089
  • 博文数量: 15
  • 博客积分: 502
  • 博客等级: 下士
  • 技术积分: 158
  • 用 户 组: 普通用户
  • 注册时间: 2005-06-28 01:18
文章分类

全部博文(15)

文章存档

2012年(1)

2010年(2)

2008年(1)

2006年(6)

2005年(5)

我的朋友

分类: 项目管理

2010-04-16 03:12:18

前段时间参加一个项目,完成其中一部分,要求提供一个WebService来屏蔽对GSM Modem的操作,实现短信收发、内容的解析和处理。因为语言不限,就首先想到了C#,东西很快就做出来了,但测试的时候发现,每调用一次WebService函数,整个包含该函数的DLL就被加载一次。这个很让人头疼,因为我的数据库连接和串口都是需要常打开的,串口每次打开关闭的时间倒是算不了多少,可数据库连接就不同了。另一方面,如果不在DLL中保存数据库连接之类的东西,那就要另做一程序常开,让WebService和它通信,这也麻烦。MS这么搞真是让人想不通:假设这里面有几百个函数,而其中一些函数具有相关性,那么也是这种每调用一个函数就加载/卸载整个DLL一次?再假设Google的地图服务也是C#做的,难道我每调用里面的一个函数,这个地图服务的DLL就要被加载一次?但是卡在这里几天也没找到解决办法,最好只好转QT + gSoap

因为QTgSoap以前都用过,所以初步版本拿出来也没费多大事。但是后来的事情不那么顺利了,花在程序基本功能之外的时间反倒是据了整个开发过程的大部分。

这些不顺利,根本的原因可能是自己对QT的期望值太高了。虽然是一个小项目,但是许多地方感到了它与一个“成熟的、综合性的Framework”之间的距离。当然,另一方面,QTNokia收购后,虽然现在版本更新很快,但不知道它能让QT在桌面应用上走多远,毕竟,Nokia的老本行是手机,不是计算机硬件,也不是基础软件。

写这篇文章,一是想记住些东西,项目快完成的时候曾想把遇到的问题记下来,但过了几天没记有好些又忘了;二是把自己遇到的问题拿出来,有兴趣的人可以一起讨论,一起进步。

废话讲不少了,下面是问题列表:


0gSoap的问题(后面全是QT的)。它生成的代码中run函数是个死循环,所以你关闭它用来监听的socket后线程还是不能退出,导致此时的QT程序无法退出。它提供了run(),但却没有stop()。所以只好自己修改run()函数,再自己加一个stop()函数。


1、QT自带的WebService只支持客户端没有服务端。不知道QT的后续版本中会不会加上?


2、数据库无法连SQL Server Express版,这个问题搞了两天无果,只好不支持,期望看到此文的高手解答。


3、信号量没有像QMutex那样尝试分配资源的函数。我想用它来限制程序只能运行一次,结果QSystemSemaphore::acquire()是阻塞式的,又没有tryAcquire(),也没有获取资源数的函数。最后调用win32 API CreateMutex()解决。


4、服务器程序嘛,为防止用户误操作点了关闭按钮就把程序给退掉了,我就想拦截窗口的最小化和关闭事件,也就是做成CCProxy那样,当用户点最小化/关闭按钮时把窗口缩小到托盘图标。这就又有了两个问题,一是无论是主窗口还是对话框,不用非常手段无法把窗口缩小到只有一个图标大小,当我动画缩小窗口到托盘时,它的大小应该是和托盘图标差不多大才好看,但窗口缩小到标题栏图标+一个标题文字+三个按钮大小后就再也缩不动了。好在动画缩小窗口执行的快,看不大出来。第二个就是,用重载QDialog::changeEvent()的方法捕捉到窗口最小化事件时调用hide()函数不起作用。最后只好重载QDialog::winEvent(),自己过滤SC_MAXIMIZESC_MINIMIZESC_CLOSE消息来解决。


5QTimer::start()函数的调用必须和打开这个QTimer的函数在同一个线程中,这个限制不爽。


6、windowslinux下都有服务吧?QT是不是应该对此封装一下?和前面缺乏WebService服务端一样,这个好像也是由第三方库来提供。


7、windowslinux下都有系统运行日志或者叫事件记录吧?QT是不是也该封装一下?我的程序要在系统启动时自动启动的。当配置文件中数据库地址指向的是本机时,需要检测SQL Server的安装、服务运行情况、目标数据库的加载情况等,前面那个通过读注册表来实现,中间一个因为QT没有封装系统服务,就只好用api了,最后一个是要查看系统日志,就是“事件查看器”中的那些,但我要在代码里面做,不得已也还是用api来解决。我想处处要让人用非常手段才能完成工作的库,就不是一个好库。


8QT自身不带串口类,而QT程序有不少是在嵌入式设备里面跑的,这些设备往往会用到串口,QT库为何就不能自带一个?现在也是用的第三方库QextSerialPort,还是个alpha版,都两三年没得更新了。尽管这个库从sf转移到了google code上,但是几个月前把它从新站点上弄下来一看,版本号还是没变。期待QT自己出一个串口库,最好连usb、蓝牙等都封装一下。


9、进程管理,这个很基础吧?更基础一些,我想看一下哪个进程有没有在运行,用QProcessQApplication?还是QCoreApplication


10QThread::wait()不能用在GUI线程中,但又没有提供一个即能用在GUI线程也能用在非GUI线程中的方便的wait()函数。


11、既然qrc可把图片等资源编译进exe文件,那为何还要再通过.rc文件来指定应用程序图标?通过qt的资源系统就是做不到?大概二年前就这个问题问过当时的TrollTech,人家回复说只能这样。


12QT库对jpg图像的解析有问题?我的托盘图标刚开始用的是资源中jpg图片,在Windows 2003debugrelease版都能正常显示。但到了另一台Win2003上就不行,又换了台XP,结果是release版不行,debug就可以。改了好多次代码,把图片从资源加载改成从用绝对路径的硬盘文件也还是不行,最后实在没办法只好怀疑起图片格式来,无奈地试着把jpg图片换成png的,竟然就好了!


13QT程序不能在中文路径下编译。


14、QIODevide::pos()的返回值是从0开始还是从1?文档里面没说。


15、现在的QtCreator 1.3.1还是有些简单和粗糙,例如不支持从代码生成UML类图,当打开一个哪怕是很简单的窗体时,整个界面就被分成了密密麻麻一个接一个的小方格,大部分时间是在调整窗口大小和拖滚动条。用起来很不爽。


16、最后一个,新的C++标准草案在324日出来了,之前看过一篇文章,里面提到QT本身很难从中受益,实际上,我最期望看到的C++库是,几乎全是标准C++写的,不要什么QStringqint64,也不要什么DWORDLPWSTR,最好,指针也极少出现。但是,受限于C++的过度保守(BS接受采访时讲,C++0x中要不要datetime类型还有待讨论!)和表达能力上过于基础:仅是些最最基础的东西,datetime没有,正则表达式没有,对象的二进制兼容没有,各个库里面充斥着XInt64,YInt64ZInt64……。不过C++的存在和缓慢的发展倒是好像得益于这种“过于基础”的表达能力。越来越感觉它像个跟不上时代的、老态龙钟的老功臣了。


总结:QT离一个成熟的、综合性的Framework还是有些距离的。虽然是个只有几千行代码的小项目却遇到了如此多的问题。





阅读(15012) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

lch9222016-03-09 11:19:45

第十二条,Qt对jpg的图片支持是通过插件的形式支持的,在程序目录加入plugins\\imageformats\\qjpeg4.dll就好了,其中qjpeg4.dll可以从Qt目录里找到

chinaunix网友2010-07-23 23:35:07

不知道QT商业版这些什么样……