Windows8/10中的UWP(或“Metro”)应用程序不在前台时可以暂停。处于此状态的应用程序继续存在但不再消耗CPU时间。引入此更改似乎是为了提高平板电脑和手机等低功耗/存储设备的性能。检测处于这种状态的进程的最优雅、最简单的方法是什么?目前我可以看到2种可能的解决方案:调用NtQuerySystemInformation()并枚举每个进程和每个线程。如果所有线程都处于挂起状态,则进程被“挂起”。这种方法将需要大量代码,而且关键的是NtQuerySystemInformation()只是半文档化的,可能会在未来的操作系统中被删除。NtQueryInformationProces
我的应用程序必须每隔几*microsec*s暂停和恢复一个不同的进程。它工作正常,只是有时感觉它暂停了非制服时间的过程。我使用winAPI:ResumeThread和SuspendThread。另一方面,我尝试了一些不同的东西。我像往常一样使用SuspendThread暂停了线程,但是当我恢复它时,我确实喜欢这样:while(ResumeThread(threadHandle)>0);而且它工作得更快,并且以统一的速度运行其他进程。为什么会这样?有没有可能有时候线程被挂起两次,然后执行ResumeThread命令?谢谢:) 最佳答案
我正在尝试实现一个Windows服务,该服务在系统进入待机模式(sleep)时发送一条消息。我的测试机操作系统是Windows8专业版。该服务已覆盖CanHandlePowerEvents=true和OnPowerEvent,它确实接收到电源事件。我遇到的问题是:OnPowerEvent从来没有收到QuerySuspend消息。然而,它确实在计算机进入挂起状态之前收到挂起消息,但操作系统不会等待OnPowerEvent方法完成,它只是进入挂起模式而不管,然后在恢复后,OnPowerEvent方法的执行将继续。通过Internet发送消息可能需要1-2秒,因此它总是在计算机恢复后发送,而
是否有任何可能的方法来保护exe不被挂起?请注意,我是应用程序的所有者。 最佳答案 SysinternalsProcessExpert等工具允许您暂停任何进程。如果用户具有管理员权限,则无法避免这种情况。ThisSOanswer显示了暂停Windows进程的三种解决方案。然而,有一种方法可以使这变得极其困难:解决方案包括为您的应用程序设置影子进程。应用程序和影子进程然后应监视彼此的挂起状态并在必要时恢复挂起的进程:由于进程必须一个接一个地挂起,这种孪生方法可确保两个进程之一处于事件状态并且可以防止挂起。但是,这种持续监控非常耗费CP
在Windows(最好是XP)上,当进程在特定地址(在它的虚拟地址空间中)写入时,通常可以挂起进程吗?加载的DLL执行写操作而不是进程本身的(PE)镜像中的代码这一事实使问题变得复杂。 最佳答案 您可以使用VirtualProtect和PAGE_GUARD或其他选项保护包含感兴趣地址的页面,并在地址写入时出现异常。此类异常可以由未处理的异常过滤器处理(视情况而定,应用程序可能会自行处理),或由进程外调试器应用程序处理,例如众所周知的调试器或通过API自定义应用程序调试进程。调试器应用程序可以在必要时暂停进程,或者使用快照进行小型转储
如何以编程方式使操作系统关闭、离开并停止执行任何操作,以便程序可以完全控制PC系统?我有兴趣在MSWindows和Linux环境中执行此操作。考虑的任何语言或API。我希望操作系统停止抢占我的程序,停止其虚拟内存管理,停止其设备驱动程序并中断服务例程的运行,然后基本上就消失了。然后,当我的程序在裸机上遇到问题时,我希望操作系统在不重新启动的情况下再次返回。这可能吗? 最佳答案 对于Linux,您可以使用kexecjump将控制完全转移到另一个内核(即您的程序)。当然,能力越大,责任越大-服务中断和避免损坏旧内核的内存完全取决于您。您
这个问题在这里已经有了答案:HowcanIfreezetheexecutionofaprogram?(4个答案)关闭2年前。使用Win32API只能使用SuspendThread()暂停单个线程,但不能在一次调用中暂停一个完整的进程。遍历进程线程并一次挂起它们不是一个好的选择,因为它可能会导致死锁和意外行为。这应该是在内核中使用DDK中的一个函数(我不记得它的名字)是可能的。如何将此功能公开给用户模式?有没有其他不进入内核的方法来实现这一点?SysInternals进程浏览器有一个暂停进程的选项。它是如何做到的?
在我的应用程序中,我正在通过另一个线程(GUI线程除外)执行文件读取。有两个按钮分别用于暂停和恢复线程。privatevoidBtnStopAutoUpd_Click(objectsender,EventArgse){autoReadThread.Suspend();}privatevoidBtnStartAutoUpd_Click(objectsender,EventArgse){autoReadThread.Resume();}但我正面临这个警告,Thread.Suspendhasbeendeprecated.PleaseuseotherclassesinSystem.Thread
我正在用C#制作一个应用程序,它使用winform作为GUI和一个在后台运行的独立线程自动更改内容。例如:publicvoidRun(){while(true){printMessageOnGui("Hey");Thread.Sleep(2000);//Domorework}}我如何让它在循环的任何地方暂停,因为循环的一次迭代大约需要30秒。所以我不想在它完成一个循环后暂停它,我想按时暂停它。 最佳答案 varmrse=newManualResetEvent(false);publicvoidRun(){while(true){mr
我正在调试一个有很多线程的应用程序。我的断点设置为暂停整个VM。当线程遇到其中一个断点时,我想使用StepOver。但这似乎会恢复整个虚拟机,直到该步骤完成。如果我可以只步进遇到断点的单个线程,那将非常有帮助。在IntelliJ11.1/Java6中有什么方法可以做到这一点吗?(希望我没有遗漏一些明显的东西......) 最佳答案 此功能已在IntelliJ16中添加(他的回答中引用的CrazyCoder问题已解决)更多细节在这里:https://blog.jetbrains.com/idea/2016/02/intellij-id