コード例 #1
0
        void MonitorThread(object Msg)
        {
            ThreadMsg msg  = (ThreadMsg)Msg;
            bool      quit = false;

            Process[] processes = Process.GetProcessesByName(msg.programID.ToString() + ".exe");
            DateTime  begin     = DateTime.Now;
            double    during    = 0;

            do
            {
                if (processes.Length > 0)
                {
                    if (processes[0].WorkingSet64 / 1048576 > 4)
                    {
                        quit = true;
                    }
                }
                else
                {
                    processes = Process.GetProcessesByName(msg.programID.ToString() + ".exe");
                }
                during = (DateTime.Now - begin).TotalMilliseconds;
                if (during > 60 * 1000 || msg.RunThread.ThreadState == System.Threading.ThreadState.Stopped)
                {
                    quit = true;
                }
            }while(!quit);

            if (msg.RunThread.ThreadState != System.Threading.ThreadState.Stopped)
            {
                msg.RunThread.Abort();
                Process cmd = new Process();
                cmd.StartInfo = new ProcessStartInfo
                {
                    FileName  = "c:\\windows\\system32\\cmd.exe",
                    Arguments = "/c taskkill -f -im " + msg.programID + ".exe"
                };
                cmd.Start();
                cmd.WaitForExit();
                cmd.Close();
                Common.CqApi.SendPrivateMessage(msg.args.FromQQ, Common.CqApi.CqCode_At(msg.args.FromQQ) + "程序已被强制退出:超时或过大的内存占用");
            }
            else
            {
                Common.CqApi.SendPrivateMessage(msg.args.FromQQ, Common.CqApi.CqCode_At(msg.args.FromQQ) + Environment.NewLine + " 运行用时" + during + "ms" + Environment.NewLine + programRet);
                programRet = "";
            }
            File.Delete(temFolder + "\\" + msg.programID + ".exe");
            File.Delete(temFolder + "\\" + msg.programID + ".cpp");
        }
コード例 #2
0
        /// <summary>
        /// Type=21 好友消息<para/>
        /// 处理收到的好友消息
        /// </summary>
        /// <param name="sender">事件的触发对象</param>
        /// <param name="e">事件的附加参数</param>
        public void ReceiveFriendMessage(object sender, PrivateMessageEventArgs e)
        {
            // 本子程序会在酷Q【线程】中被调用,请注意使用对象等需要初始化(CoInitialize,CoUninitialize)。
            // 这里处理消息

            //Common.CqApi.SendPrivateMessage(e.FromQQ, Common.CqApi.CqCode_At (e.FromQQ) + "你发送了这样的消息:" + e.Msg);
            string code = "";

            string[] msg = e.Msg.Split(Environment.NewLine.ToCharArray());
            if (msg[0].Trim() == "run19132")    // 如果此属性不为null, 则消息来自于匿名成员
            {
                for (int i = 1; i < msg.Length; ++i)
                {
                    code += msg[i] + Environment.NewLine;
                }

                Random random    = new Random();
                long   programID = e.FromQQ;
                if (File.Exists(temFolder + "\\" + programID + ".exe"))
                {
                    Common.CqApi.SendPrivateMessage(e.FromQQ, Common.CqApi.CqCode_At(e.FromQQ) + " 你的上一个程序正在运行,请等待其结束再操作");
                }
                else
                {
                    Common.CqApi.SendPrivateMessage(e.FromQQ, Common.CqApi.CqCode_At(e.FromQQ) + Environment.NewLine + " 正在试图编译...");
                    File.WriteAllText(temFolder + "\\" + programID.ToString() + ".cpp", code);

                    Thread    runthread     = new Thread(new ParameterizedThreadStart(RunThread));
                    Thread    monitorthread = new Thread(new ParameterizedThreadStart(MonitorThread));
                    ThreadMsg threadMsg     = new ThreadMsg()
                    {
                        args          = e,
                        programID     = programID,
                        RunThread     = runthread,
                        MonitorThread = monitorthread
                    };
                    runthread.Start(threadMsg);
                    monitorthread.Start(threadMsg);
                }
            }
            e.Handled = true;
            // e.Handled 相当于 原酷Q事件的返回值
            // 如果要回复消息,请调用api发送,并且置 true - 截断本条消息,不再继续处理 //注意:应用优先级设置为"最高"(10000)时,不得置 true
            // 如果不回复消息,交由之后的应用/过滤器处理,这里置 false  - 忽略本条消息
        }
コード例 #3
0
        void RunThread(object Msg)
        {
            ThreadMsg msg      = (ThreadMsg)Msg;
            Process   Compilar = new Process();

            Compilar.StartInfo = new ProcessStartInfo()
            {
                FileName              = "c:\\windows\\system32\\cmd.exe",
                Arguments             = "/c g++ " + temFolder + "\\" + msg.programID.ToString() + ".cpp -o " + temFolder + "\\" + msg.programID.ToString() + ".exe",
                RedirectStandardError = true,
                UseShellExecute       = false
            };
            Compilar.Start();
            Compilar.WaitForExit();
            string CompilarRet = Compilar.StandardError.ReadToEnd();

            if (CompilarRet == "")
            {
                CompilarRet = "编译成功,运行中...";
            }
            Compilar.Close();
            Common.CqApi.SendPrivateMessage(msg.args.FromQQ, Common.CqApi.CqCode_At(msg.args.FromQQ) + Environment.NewLine + CompilarRet);

            if (CompilarRet == "编译成功,运行中...")
            {
                Process program = new Process();
                program.StartInfo = new ProcessStartInfo()
                {
                    FileName  = "c:\\windows\\system32\\cmd.exe",
                    Arguments = "/c " + temFolder + "\\" + msg.programID.ToString() + ".exe",
                    RedirectStandardOutput = true,
                    UseShellExecute        = false
                };
                program.Start();
                program.WaitForExit();
                programRet = program.StandardOutput.ReadToEnd();
                program.Close();
            }
        }