美文网首页
WaitForInputIdle 实验

WaitForInputIdle 实验

作者: 魔人健太郎 | 来源:发表于2020-10-04 03:17 被阅读0次

直接启动一个具有多进程的游戏。
等也不等直接使用 Process.GetProcessesByName() 毫无疑问 c#太快了,只获取到一个。实际上人家启动完后有四五个进程。

PS C:\Users\k1mlka> tasklist | findstr Game.exe
Game.exe                      4300 Console                    1     57,472 K
Game.exe                      2388 Console                    1      8,540 K
Game.exe                      5908 Console                    1      8,212 K
Game.exe                     10324 Console                    1     58,916 K
Game.exe                      2280 Console                    1    182,588 K

使用 WaitForInputIdle(7000) 去等待进程先启动,结果用 0.135894 就卡完了。(大都100-200ms间)这次Process.GetProcessesByName() 倒是给我找到了俩个进程,这也还不是全部。看样子这些进程怕不是一个调用一个出现的。
(并不绝对)
把WaitForInputIdle 等待时长使劲调小,最小为0,-1就无限期等待了。
返回值是false,这是还未等待完的意义。返回True就是不阻塞io了。

也许可以让所有进程都走一遍WaitForInputIdle 来实现以最快的方式准确的获取所有进程。

True 就加载完,False还在等。超过7秒就报错。大致思路就是,获得Proceses-> 全跑WaitForInputIdle -> 再探有无新Proc,没有就结束,有就再跑新的。这个方法也不会影响使不使用LE,更犯不着改LE源码,让程序返回PID给你。
再测试一下所有进程的MainWinHandle情况

程序使用WaitForInputIdle找到所有进程。
对每一个进程都走一遍WaitForInputIdle,其中时间最长的那个大概率是含有窗口handle的进程。
但是窗口明明都已经出来了,最后那一进程还是被WaitForInputIdle卡住不知是何原因。甚至不关游戏不会停。项目里从没遇到过这情况.

            bool newProcFlag;
            do
            {
                newProcFlag = false;
                ProcList.Clear();
                foreach (Process p in Process.GetProcessesByName("Game"))
                {
                    ProcList.Add(p);
                    if (!dict.ContainsKey(p.Id))
                        dict.Add(p.Id, false);

                    if (dict[p.Id] == false)
                    {
                        Console.WriteLine($"新进程{p.Id}");
                        if (p.WaitForInputIdle(7000) == false)
                        {
                            Console.WriteLine("Error");
                            //return;
                        }
                        dict[p.Id] = true;
                        newProcFlag = true;
                    }
                }
            } while (newProcFlag);

            // Result
            foreach(var p in ProcList)
            {
                Console.WriteLine($"{p.Id} {p.MainWindowHandle}");
            }

得出的结论是,有些进程会无限卡住,还不一定是窗口线程。
但是handle还是有了的。主要还是依据handle数值来判断吧。
再续...

相关文章

  • WaitForInputIdle 实验

    直接启动一个具有多进程的游戏。等也不等直接使用 Process.GetProcessesByName() 毫无疑问...

  • 高级语言程序设计实验(双数号题)

    实验二 实验四 实验六 实验八 实验十

  • 2017-05-28

    实验一 实验二 实验三 实验四 实验五

  • 实验一下

    实验一下实验一下实验一下实验一下实验一下实验一下实验一下实验一下实验一下实验一下实验一下实验一下实验一下实验一下实...

  • 实验实验实验吖!

    昨天的三个基因pcr、双酶切鉴定都正确了呀!虽然有一个条带比较弱,但也还是有的,所以今天送去测序啦!开心ヽ(^㉨^...

  • 实验

    1.字体实验; 1.字体实验; 2、格式实验; 2、格式实验; 3:颜色实验。 3:颜色实验。(超链接)

  • uos 系统监控与进程管理

    1、实验-查询系统状态 2、实验-top 3、实验-kill 4、实验-前台和后台 实验-区别

  • 霜怎样形成的实验

    实验目标:通过实验了解霜形成的原理 实验重点:整个实验的操作步骤 实验难点:讲解霜形成的原理 实验教具:冰块,盐,...

  • 认识wireshark的界面

    实验环境实验环境 操作机:Windows XP 实验工具: ToolsPath Wireshark桌面 实验文件:...

  • 实验

    实验实验

网友评论

      本文标题:WaitForInputIdle 实验

      本文链接:https://www.haomeiwen.com/subject/oyiguktx.html