如何在c#中延迟计算机?创造滞后!

时间:2011-04-29 17:37:02

标签: c#

这是一个奇怪的问题,我明白了。我也认为这很简单,因为我知道我已经创造了无限循环的份额。

我试图在C#中造成轻微的PC延迟 - 特别是我需要在系统范围内创建'波涛汹涌的鼠标'情况(不仅仅是沙盒exe)。

小应用程序无法崩溃计算机!滞后应该能够持续2-10秒,然后停止。

到目前为止我尝试了什么: - 大量保存数据的线程(填满内存并导致PF使用,没有实际延迟)。

-Spawning TONS of threads(首先是滞后,但是当再次重新生成踏板时则没有 - 就像第二次操作系统准备就绪一样)。

- 拍摄多个截图的线程(截图似乎没有滞后)。

这些都没有用 - 任何想法?

可选的背景故事(可选): 在不泄露任何公司信息的情况下,申请的原因是为了掩盖生产环境中的滞后背景流程。我们尝试加速应用程序,或者改进计算机而没有任何结果。当生产工人将滞后与此后台应用程序运行相关联时,存在滥用案例。我们的目标是通过谨慎地随机创建一个类似的滞后来消除这种滞后。

澄清: 最初的背景应用程序不是本土的(fyi)唯一真正的解决方案是购买1000个新盒子。该公司正在采用更便宜的“隐藏背景应用程序”......“解决方案”。我知道......

5 个答案:

答案 0 :(得分:2)

您可以创建一个后台应用程序,该应用程序以所需的时间间隔随机调用Windows BlockInput API。这使您的应用程序具有尽可能小的占用空间,防止它占用CPU周期和内存。

更多信息: http://msdn.microsoft.com/en-us/library/ms646290.aspx

那就是说,我同意其他帖子/评论,这是针对症状而不是问题。

编辑:代码示例

using System.Runtime.InteropServices;
using System.Threading;

namespace LagTimer
{
    class Program
    {
        [return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        public static extern bool BlockInput([In, MarshalAs(UnmanagedType.Bool)] bool fBlockIt);

        static void Main(string[] args)
        {
            Thread t = new Thread(LagTick);
            t.Start();

            while (true) { } // Prevent the app from exiting
        }

        static void LagTick()
        {
            while (true)
            {
                BlockInput(true);
                System.Threading.Thread.Sleep(250);
                BlockInput(false);

                // TODO: Randomize time in between ticks
                Thread.Sleep(100);

                // TODO: Add logic for when to "sputter" the mouse
            }
        }
    }
}

答案 1 :(得分:0)

您可以创建一个具有无限循环的线程,并且每隔X秒会引发一个UI线程捕获的事件。然后,UI线程可以随时调用Thread.Sleep。

答案 2 :(得分:0)

请不要这样做

也就是说,可以通过创建一些与系统中逻辑处理器核心数相匹配的线程来实现,设置每个线程的处理器关联性,使每个核心有一个,然后让每个线程运行代码像这样:

int i = rand();
while (!timeLimitExpired())
{
    i += rand() % i;
}

rand()调用的目的是让编译器优化不要意识到你的循环实际上没有做任何事情并将其优化掉,模运算的目的是防止创建溢出(异常)(你也可以使用简单的划分)。

因为我认为你不应该这样做,所以我不会分享有关如何确定处理器核心数或检测线程关联性的代码。相反,请修复您的应用。这可能就像在某个地方的紧密循环中添加sleep()调用一样简单。

答案 3 :(得分:0)

听起来你正试图做一个定时繁忙的循环。最简单的方法就是检查时钟的紧密循环,并在证书的时间增量已经过去时退出。

现在,在典型的PC上,当发生这种情况时,您可能看不到任何“滞后”。为什么?那么有几个原因。

  1. 多个CPU。如果你不在每个CPU上都这样做,那么有一个免费的CPU供操作系统使用,你可能没有注意到它们的区别。为了确保您使用的是每个CPU,我建议创建一个进程来运行CPU密度设置或CPU 0的“cpu eater”,然后为系统所拥有的每个CPU运行另一个进程。
  2. 任务优先级。通常,像桌面这样的东西比后台任务具有更高的优先级。如果你想让你的程序不被它抢占,你需要把它作为一个非常高的优先级。
  3. 注意:如果您将任务设置为高优先级,然后以某种方式将其设置为在启动或登录时运行,我对您对机器或操作系统重新安装所造成的任何损害不负责任您将被迫执行。此外,长时间咀嚼大量CPU会导致具有库存冷却设置的PC过热。这会导致崩溃,有时会造成永久性损坏。


    我想补充一点,虽然我们开发人员不必签署任何道德准则来获得像医生,律师这样的专业许可证,而且有些工程师必须这样做,但仍有时我们有义务拒绝执行不道德的要求。

    既然你说这些是你公司自己的机器,他们希望减速,这是屈膝的,但不是不道德的。但是,如果这些是客户机器,那么我就不得不放下脚步。你的老板不会感谢你(甚至可能会解雇你),但如果/当客户发现真正发生的事情时,你的公司会绝对。为公司和客户做正确的事情,违背主管的意愿,是道德的全部意义。

答案 4 :(得分:0)

绑定

Form2 Form = new Form2();

// open form2
Form.Show();

private void timer1_Tick(object sender, EventArgs e)
//spam form2. Maybe set timer Interval to 10 or 5.
{

}

它会在4分钟左右内持续激烈。至少我无法访问任务管理器。

form2属性,不透明度为0%,windowsstate =最小化,不显示在任务栏中。

这是一个例子:

private void timer1_Tick(object sender, EventArgs e)
//spam form2. Maybe set timer Interval to 10 or 5.
{
    Form2 Form = new Form2();

    // open form2
    Form.Show();
}