一直用Qt Creator开发Qt程序,Nokia的Qt Creator实在太慢了,启动慢,编译速度也是超级慢。昨天,终于它慢的让我无法忍受了,我决定抛开手上的一切工作,深入挖掘Qt Creator启动慢的原因。首先,怀疑是给力的Mcafee企业版卡住程序了。试试把Mcafee的一切监控都关闭,没效果!然后怀疑系统进程太多了,卸载掉SONY送的一堆无用程序,没效果!继续怀疑某些进程与Qt Creator有冲突(Windows7 x64嘛),kill掉所有无关进程,没效果!重置Windows的系统服务,没效果!我擦,人品差,Qt Creator与Win7 x64不兼容,我的出了这么个结论。连更改程序兼容性设置都不行?!

正当拿它没辙时,同学说它电脑上的Qt Creator跑的很欢很开心,也是Win7 x64。太打击了,都是Win7 x64,为何我这跑龟速?算了,身为软件开发人员,还是专业点吧,祭出Process Monitor,我偷窥它!呃……x64系统下跑32位程序,一大坨的Wow的dll调用要看吐。

但是,记录中一连片的Process Profiling操作耗时很久,1个耗时1秒钟左右。那Process Profiling是啥呢?后来,查了许多资料,发现它只是当程序空闲时Windows方便统计CPU使用率等性能信息插入的探测操作。也就是说,这么大会儿,Qt Creator啥都没干?!上面有个Qmake.exe的调用操作,难道启动慢跟它有关?找到了Qmake.exe,拿鼠标敲它两下,果然一个黑框卡住不动。搞半天,发现Qt Creator启动慢确实与Qmake启动慢有关,但也不全怨Qmake,Creator自己也有问题!

哎,瞅着一大片的Process Profiling没辙,谁让我软件调试没学好呢。WinDbg不会用呀,就是会用还得弄pdb,弄pdb还得重新编译Qmake和Qt Creator……无意间,禁用网卡试试,一下把所有网卡全部禁用。Qmake和Qt Creator居然奇迹般的启动飞快!这样行?!那我拿墙堵这俩进程不就好了!打开落灰的Windows自带防火墙,在高级规则里禁止Qmake和Qt Creator如站/出站。居然不行!也许这俩程序启动时在等个什么结果……能等啥呢?解决网络问题,当然还是要抓包,祭出Wireshark来抓包,居然是这样:

NBNS是NetBIOS Name Service的缩写,貌似Qt Creator在启动时查询CMAKE/CMAKE.EXE/SH.EXE这样的主机名?!这行为太匪夷所思了,还是得找源码看看:

#ifdef Q_OS_WIN
static QStringList detectShellPath()
{
    QStringList paths;
    QString path = qgetenv("PATH");
    QStringList pathlist = path.toLower().split(";");
    for (int i = 0; i < pathlist.count(); i++) {
        QString maybeSh = pathlist.at(i) + "/sh.exe";
        if (QFile::exists(maybeSh)) {
            paths.append(maybeSh);
        }
    }
    return paths;
}
#endif

这是Qmake的一段代码,它在启动时获取名为“PATH”的环境变量,然后用“;”拆开成为一个QStringList,最后把PATH环境变量中的每个路径都连接“/sh.exe”成为新路径,用QFile查找该路径是否存在。这样的的话,怎会产生查询SH.EXE主机名的操作呢?回过头来,在Qmake启动的Process Monitor监控记录中找到如下的操作:

居然用CreateFile打开\\sh.exe\,查一下MSDN,CreateFile是这么理解这种写法的:\\servername\pipe\pipename。CreateFile居然真的把sh.exe当作服务器名,来创建一个管道-_-!那这个“\\sh.exe\”是哪来的呢?由上面的代码,它是从环境变量拼出来的。我看一眼我的PATH环境变量,一下震惊了!!!里面一段是这样写的“;C:\Program Files\WIDCOMM\Bluetooth Software\syswow64;\;”。这个该死的反斜杠是啥时候弄出来的!去掉反斜杠,再次启动Qmake和Qt Creator,它俩终于像在我同学电脑上那样跑的很欢很开心了!

总结:看似系统问题,实则程序问题;看似程序问题,实则网络问题;看似网络问题,实则环境变量问题!如果Windows防火墙真的能把创建远程管道操作堵住的话,也许我永远找不到问题的真相。问题的根源和表象差的好远呀!

http://www.cnblogs.com/codingmylife/archive/2011/03/03/1970357.html

楼主你太牛了!!我也遇到了同样的问题,发现最新版Qt Creator 2.4.0在启动时会访问2个地址lillemy.nokia.kunder.linpro.no:http和hx-in-f118.1e100.net:http;导致这个IDE启动时奇慢无比,NND不知道nokia要干嘛;
经过一番折腾,发现是QtCreator的一个插件造成的:打开QtCreator.exe->帮助->关于插件->展开Qt Creator,找到Welcome插件,设置为不选中;重新启动,OK!

由Qmake.exe/QtCreator.exe启动速度慢挖进去(非常有趣的调试过程,作者态度不错,而且关闭Welcome插件也是常见办法)的更多相关文章

  1. 使用instsrv.exe+srvany.exe将应用程序安装为windows服务[转]

      转自:http://qingmu.blog.51cto.com/4571483/1248649 一.什么是instsrv.exe和srvany.exe instsrv.exe.exe和srvany ...

  2. 运行tomcat7w.exe tomcat7.exe ,提示 指定的服务未安装 unable to open the service 'tomcat7'

    运行tomcat7w.exe tomcat7.exe ,提示 指定的服务未安装 unable to open the service 'tomcat7'(用的是绿色的Tomcat7) 解决方法: 打开 ...

  3. 宿主进程 [*.vshost.exe] & [*.vshost.exe.config]

    宿主进程 [*.vshost.exe] & [*.vshost.exe.config] pdb文件: 英文全称:Program Database File 中文全称:程序数据库 文件 Debu ...

  4. instsrv.exe srvany.exe启动服务

    1.通过注册表注册服务 private static readonly string regpath = @"SYSTEM\CurrentControlSet\Services\Consul ...

  5. 关于wcf三大工具的使用(wsdl.exe svcutil.exe disco.exe)

    首先,我们必须创建一个wcf服务.并部署到IIS中.这里我已经将一个StudentService服务部署到我自己的电脑了. (1)svcutil.exe svcutil.exe工具的作用是通过服务地址 ...

  6. C# 中的.pdb/ .vshost.exe/ .vshost.exe.manifest文件

    转自 C# 中的.pdb/ .vshost.exe/ .vshost.exe.manifest文件讨论 pdb文件: 英文全称:Program Database File 中文全称:程序数据库 文件 ...

  7. vcredist_x64.exe vcredist_x86.exe 静默安装方法收集

    vcredist_x64.exe /install /quiet /norestart 更多方法参考如下: http://www.cnblogs.com/lidabo/archive/2013/01/ ...

  8. php.exe php-cgi.exe php-win.exe的区别

    php.exe(linux下是php/bin/php)是提供来在命令行(命令行解释器)执行PHP文件的工具,比如你在有文件abc.php,那么你可以在CMD命令提示符下执行命令php.exe abc. ...

  9. 用MT.exe将exe中的manifest文件提取出来和将manifest文件放入exe中

     前一种方法是将manifest文件放入exe中,但是要记得需要在工程中设置 这样的话exe中就不存在manifest了,在debug目录下就会看到相应的manifest文件.后者是将exe中的man ...

随机推荐

  1. Android中的后台邮件发送

    一.调用邮件发送工具类进行邮件发送 new Thread(){ public void run() { try { GMailSender sender = new GMailSender( &quo ...

  2. Android中使用JUnit测试

    package com.meritit.lottery.test; import java.util.List; import android.test.AndroidTestCase; import ...

  3. less循环写css工具类

    //margin-right=================.mr(100); .mr(@n, @i: 1) when (@i =< @n) { .mr-@{i} { margin-right ...

  4. Delphi 快速获取文件大小(使用_lopen和FileSeek,此函数可以快速获取文件大小,即使文件已经被其它程序锁定)

    function GetFileSize(const fName: AnsiString): Int64; var hFile: THandle; begin hFile := _lopen(PAns ...

  5. 对于ado.net dataProvider的介绍

    学习刘皓的 ADO.NET入门教程(二)了解.NET数据提供程序 而来 这篇文章很一般,主要是对dataProvider做了个简单的介绍.因为在该系列文章中提到,ado.net主要有两部分 dataP ...

  6. Metropolis 采样与蒙特卡洛算法

    Metropolis 算法又叫 Metropolis 抽样,是模拟退火算法的基础,在早期的科学计算中蒙特卡洛方法(Monte Carlo)是对大量原子在给定温度下的平衡态的随机模拟,当蒙特卡洛算法计算 ...

  7. 【多线程】python界面阻塞,白屏,not responding解决的简单例子

    x = 0 QWidget. self.thread = Worker() self.xLable = QLabel( self.spinBox = QSpinBox() self.spinBox.s ...

  8. android自定义View绘制天气温度曲线

    原文:android自定义View绘制天气温度曲线 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012942410/article/detail ...

  9. 使用Struts2的iterator标签遍历复杂Map种类

    1.建一个Webproject.加入Struts2支持. 2.创建两个实体类: a). Mother(母亲)的Java类. package struts.map.entity; import java ...

  10. C++ CGI开发环境备录

    1. 安装apache2: apt-get install apache2 2. 配置用户目录 在/etc/apache2/apache2.conf中配置用户目录 <Directory /hom ...