Windows 7 Windows 7:下载数据时,我的程序中的GUI响应不佳;有什么办法可以改进吗?

Windows 7 Windows 7:下载数据时,我的程序中的GUI响应不佳;有什么办法可以改进吗?,windows-7,tcp,thread-priority,Windows 7,Tcp,Thread Priority,我编写了一个程序,使用TCP从局域网上的服务器下载多个大文件。这个程序在Linux、MacOS/X下运行良好,通常在Windows下也运行良好(它使用Qt作为GUI,并使用直接套接字调用进行联网),但在某些Windows机器上,下载似乎太多,机器无法处理,我想知道是否有人知道为什么会这样以及可以做些什么 下载文件时,我的程序生成一个单独的I/O线程,它基本上只是处于一个循环中,通过TCP下载数据并将其写入文件,每次调用QFile:write()时写入128KB。每个文件通常有几百兆字节长,一个典

我编写了一个程序,使用TCP从局域网上的服务器下载多个大文件。这个程序在Linux、MacOS/X下运行良好,通常在Windows下也运行良好(它使用Qt作为GUI,并使用直接套接字调用进行联网),但在某些Windows机器上,下载似乎太多,机器无法处理,我想知道是否有人知道为什么会这样以及可以做些什么

下载文件时,我的程序生成一个单独的I/O线程,它基本上只是处于一个循环中,通过TCP下载数据并将其写入文件,每次调用QFile:write()时写入128KB。每个文件通常有几百兆字节长,一个典型的下载会话会写出几十个这样的文件。请注意,I/O线程独立于GUI线程运行,因此我不认为它会对GUI的性能有多大影响,尤其是在多核PC上运行时

这台PC是一台运行在2.40GHz,内存为4GB的核心2Duo四芯Q6600。它运行的是Windows7UltimateSP1,32位。它通过千兆以太网连接接收数据,并将数据写入232GB内置日立ATA驱动器NTFS格式启动分区上的文件

症状是,有时在下载过程中(看起来是随机的),程序的GUI会一次失去响应10到30秒,并且通常窗口的标题栏会附加“(没有响应)”。然后症状将再次消失,下载将再次正常进行。另一个症状是桌面在下载过程中非常缓慢。。。例如,如果我单击“开始”按钮,“开始”菜单将花费约30秒的时间填充,而不是像我预期的那样几乎瞬间填充

请注意,任务管理器显示了大量的可用内存,但它确实显示了CPU使用率的短峰值,达到了4个核心中的100%,同时问题也被发现了

数据是通过千兆以太网到达的,如果我让我的程序只接收数据并将其扔掉(不将数据写入硬盘),机器可以保持约96MB/秒的恒定下载速率,而不会出一身冷汗。但是,如果我将接收到的数据写入文件,下载速率将降低到大约37MB/秒,并且上述症状开始出现

有趣的是,出于好奇,我在I/O线程的事件循环开始之前,将此调用添加到I/O线程的entry函数中:

SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL);
当我这样做时,“无响应”症状消失了,但下载速度降低到了仅25MB/秒

因此,我的问题是:

  • 有没有人知道当硬盘驱动器承受着沉重的写负载时,是什么导致GUI偶尔出现故障

  • 既然机器上有三个空闲内核,为什么降低I/O线程的优先级会导致下载速率下降这么多?我认为在这种情况下,即使是优先级较低的线程也会有大量的CPU可用

  • 有没有办法在不导致Windows桌面响应和/或我的应用程序GUI响应出现问题的情况下获得最大下载速率


    • 看不到任何代码很难回答,但这似乎与处理器有关,而且您的下载线程没有为其他线程执行其他操作留下任何空间

      它似乎从不等待,而且网卡的驱动程序写得不好。 当没有数据传入时,您确定线程正在进入空闲状态吗? 在使用单处理器的操作系统中,(;;){}将消耗100%的cpu,如果它连续与内核对话,它可能会停止其他进程或其他线程,尤其是在您的情况下,如果某些网卡驱动程序中存在错误或非常坏的行为

      可能是将线程优先级设置为低于正常值,您要求操作系统减少使用线程的频率,这是由一个神奇的组合提供的,它允许事情不会挂起太多。 检查代码,也许你忘了什么


      检查添加睡眠(0)以迫使操作系统在某个时候向另一个线程屈服是否会让事情变得更好,但这是一个临时修复,您应该找到线程消耗100%cpu的原因,如果是这样的话。

      让我谈谈您描述的下载期间的症状。正如你所说,在我的Windows7Ultimate中,同样的事情也会在工作时间随机发生,我没有运行任何繁重的线程或进程。我用于工作、访问、Outlook、Word、Visual Studio等的任何程序都会发生这种情况,特别是在使用alt tab切换程序时,每天随机切换两三次。我认为是Windows 7本身造成的,但不知道确切原因。请查看此链接,它可能有助于确定问题的原因。我不是建议你安装修补程序,但如果你需要安装任何修补程序,请采取必要的预防措施。Jeremy在10月21日23:36添加我的评论后,我用谷歌搜索了这个Windows 7问题,并按照建议停止并设置为手动“桌面窗口管理器会话管理器”以解决问题。在10月24日停止工作电脑上的服务后,我再也没有经历过这种症状;与应用程序和GUI的响应和交互实际上变得更加轻巧和快速。唯一的“缺点”是一些Windows 7 GUI外观与感觉不相似,我不在乎。我的线程不会消耗100%的CPU,它会在select()中阻塞,直到TCP套接字中有更多数据准备就绪。(当然,考虑到服务器可以以96MB/秒或更高的速度发送数据,select()确实会经常被解锁……但我很有信心代码不会忙于循环,至少不会在用户空间中)。还请注意,所讨论的计算机有4个核,其中3个为