• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            ζ∽∑∏∞ψ

            cedricporter -- [ QQ: 414112390 ]

            無聊之作 -- 延遲運行其他程序de程序 (C++版)

            // By: Cedric Porter [Stupid ET]
            // QQ: 414112390    Q群:7196588
            // 功能:運行后延遲運行其他程序,例如開機要運行一堆東西的時候就靠他了
            // 用Win32編譯方式來編譯,就可以在后臺運行了 
            /* 讀的文件格式     :    延遲時間 (單位:毫秒) 要運行的程序的路徑 
            1000 notepad
            500 calc
            2000 e:\Program Files\Tecent\QQ\QQ.exe
            */

            // 程序超爛而且我太懶了.就注釋那么多了..僅供交流..
            // 因為貼在博客上格式有點變形。所以請復制到VC下,再全選,接著按下Alt+F8格式就整齊了 

            #include 
            <windows.h>
            #include 
            <fstream>
            #include 
            <cstring>
            #include 
            <cstdlib>

            using namespace std;

            struct PARAM
            {
                unsigned 
            long delayTime;
                
            string ExePath;       
            }
            ;

            unsigned 
            long InputHandle();
            DWORD WINAPI ThreadProc(PVOID param);

            int main()
            {     
                Sleep(InputHandle()
            +2000);     // 主線程暫停等待其他線程運行完畢 

                
            return 0;
            }


            unsigned 
            long InputHandle() //處理 
            {
                ifstream inf(
            "run.log"); //存放要運行的程序的列表 
                char temp = 0;
                
            string    str_delay = "",        // 存放 
                    str_ExePath = "";

                unsigned 
            long delayTime = 0, MaxTime = 0;
                
            bool IsTime = true, next = false;

                inf.
            get(temp);

                
            while (!inf.eof())    // 判斷是否到列表文件尾部 
                {  
                    
            if (temp == 10 || temp == 13)     // 判斷是否為回車或換行,如果是,則進行處理 
                    {   
                        inf.
            get(temp);
                        
            if (str_ExePath == "")
                            
            continue;
                        IsTime 
            = true
                        next 
            = true;

                        PARAM
            * param = new PARAM;
                        param
            ->delayTime = delayTime;
                        param
            ->ExePath = str_ExePath; 
                        HANDLE handle 
            = CreateThread(NULL, 0, ThreadProc, (PVOID)param, 0, NULL);
                        CloseHandle(handle); 
                        
            //Sleep(1);

                        
            if (MaxTime < delayTime)
                            MaxTime 
            = delayTime;
                        str_ExePath 
            = "";
                        str_delay 
            = "";
                        delayTime 
            = 0;
                        
            //cout << str_ExePath << endl;   
                        continue;
                    }

                    
            else if (temp == ' ')
                    
            {
                        
            if (IsTime)
                        
            {
                            delayTime 
            = atoi(str_delay.c_str());  
                            IsTime 
            = false;
                            next 
            = false;
                            inf.
            get(temp);    
                            
            //cout << delayTime << endl;    
                            continue
                        }

                        
            if (!next)
                            str_ExePath 
            += ' ';

                    }

                    
            else
                    
            {
                        
            if (IsTime)   
                            str_delay 
            += temp;
                        
            else
                            str_ExePath 
            += temp;
                    }


                    inf.
            get(temp);
                }


                
            return MaxTime;    // 返回要延遲的最長時間 
            }


            DWORD WINAPI ThreadProc(PVOID param)    
            // 延緩運行其他程序的線程 
            {
                unsigned 
            long delayTime = ((PARAM*)param)->delayTime;
                
            string ExePath = ((PARAM*)param)->ExePath;
                delete param;

                
            //MessageBox(NULL, ExePath.c_str(), "a", 0);
                
            //e:\Program Files\Tencent\QQ\QQ.exe

                Sleep(delayTime);
                WinExec(ExePath.c_str(), SW_SHOW);
                
            //WinExec("e:\\Progra~1\\Tencent\\QQ\\QQ.exe", SW_SHOW);

                
            return 0;
            }
             


            //湛江二中 華亮

            posted on 2009-08-13 11:38 Stupid ET 閱讀(2138) 評論(19)  編輯 收藏 引用 所屬分類: Language

            評論

            # re: 無聊之作 -- 延遲運行其他程序de程序 (C++版) 2009-08-13 11:50 pear_li

            想法很可愛
            編程意識不錯,handle關閉的很及時
            但是winexec這種東西少用  回復  更多評論   

            # re: 無聊之作 -- 延遲運行其他程序de程序 (C++版) 2009-08-13 13:17 OwnWaterloo

            @pear_li
            winexec怎么了?  回復  更多評論   

            # re: 無聊之作 -- 延遲運行其他程序de程序 (C++版) 2009-08-13 13:36 OwnWaterloo

            > Sleep(InputHandle()+2000); // 主線程暫停等待其他線程運行完畢
            嚴格給的說, 要用 WaitForMultipleObjects。
            如果人品非常差, 延遲2秒還是有主線程先結束的可能, 因為調度順序是未知的。

            > 因為調度未知
            從CreateThread開始, 到次線程Sleep 之間會有未知時間的間隔。
            所以, 傳給次線程的, 不應該是delay, 而是awake_time。
            次線程在Sleep前一刻, 根據awake_time和current_time, 計算Sleep多久。
            這樣, 精度就不受CreateThread,到Sleep之間那段未知時間的影響。
            如果精度還要提高, 可以用WaitableTimer。

            > CreateThread
            在vc上用_beginthreadex代替。 dev c++如果是用的mingw, 也有這個函數。


            最后一點………… 其實偷懶的話去查AT的用法 ……
            run -> cmd -> at /?
            直接寫個bat文件:
            at xxxx notepad
            at yyyy calc
            ....

            而不用寫一個配置文件, 然后用一個程序去讀, 再執行……
            功能差不多, 精度可能低一些。  回復  更多評論   

            # re: 無聊之作 -- 延遲運行其他程序de程序 (C++版) 2009-08-13 13:37 OwnWaterloo

            高中生?  回復  更多評論   

            # re: 無聊之作 -- 延遲運行其他程序de程序 (C++版) 2009-08-13 13:53 OwnWaterloo

            @OwnWaterloo
            哦, 原來是個backward compatibility函數……  回復  更多評論   

            # re: 無聊之作 -- 延遲運行其他程序de程序 (C++版) 2009-08-13 15:12 Stupid ET

            呃...曾經是高中時寫的...從我的百度空間移過來的...@OwnWaterloo
              回復  更多評論   

            # re: 無聊之作 -- 延遲運行其他程序de程序 (C++版) 2009-08-13 15:19 11

            典型的濫用多線程的例子。 直接讀取配置來一個排序, 以一個小的粒度檢查時間來運行要運行的程序就可以了。  回復  更多評論   

            # re: 無聊之作 -- 延遲運行其他程序de程序 (C++版) 2009-08-13 15:20 Stupid ET

            哇..佩服佩服.....@OwnWaterloo
              回復  更多評論   

            # re: 無聊之作 -- 延遲運行其他程序de程序 (C++版) 2009-08-13 15:21 Stupid ET

            哦。恍然大悟,O(∩_∩)O謝謝...@11
              回復  更多評論   

            # re: 無聊之作 -- 延遲運行其他程序de程序 (C++版) 2009-08-13 18:19 OwnWaterloo

            @Stupid ET
            這些代碼是你高中寫的?? 牛……

            我覺得這思路挺好, 將n個任務分到不同線程, 然后用Sleep的方式通知OS。

            誰知道OS里面會不會有:
            “來一個排序, 以一個小的粒度檢查時間來運行要運行的”線程
            這種調度算法呢?

            誰知道OS會不會比ls某位的算法更差呢?

            誰知道windows下的創建線程開銷會比ls某位的算法高呢?


            這些都不知道, 要測也不方便。

            但是, 編碼簡單很多~~~ 同時線程間的同步也很方便處理。
            KISS~~~  回復  更多評論   

            # re: 無聊之作 -- 延遲運行其他程序de程序 (C++版) 2009-08-13 21:52 Stupid ET

            @OwnWaterloo
            小菜我剛剛高中畢業,以后多多指教哦...  回復  更多評論   

            # re: 無聊之作 -- 延遲運行其他程序de程序 (C++版) 2009-08-14 08:32 guest

            1:WinExec 返回是進程第一次調用GetMessage或者一個超時,從這點出發,還是不用WinExec為妙
            2:博主還沒處理空格符帶來的問題,WinExec填寫的參數是錯誤的,例如有個程序是e:\Program.exe,你的QQ就被病毒給劫持了。
            3:主線程應該調WaitForMultipleObjects
            4:用CreateProcess或者ShellExcute,前者可以順帶掛起進程,后者可以直接運行腳本或者打開文件。
            5:用腳本都可以實現的功能。  回復  更多評論   

            # re: 無聊之作 -- 延遲運行其他程序de程序 (C++版) 2009-08-14 09:35 11

            to OwnWaterloo:
            你真的以為線程同步比一個循環來得更簡單么? 很明顯的,啟動那些程序不需要同時執行,既然可以順序執行, 為什么不順序執行呢?我以為代碼是越簡單越好。

            這個里面只需要一個 for或while循環就可以完成

            //任務列表按執行先后排序
            //index = 0;
            //n = 任務的個數
            while(index < n)
            {
            //檢查 index 處的任務是否到了執行時間
            if(...)// 沒有到
            {
            Sleep(10); //10毫秒,可以根據需要的精度調整此檢查頻率
            }
            else
            {
            // 到了執行, 然后遞增 index 進入下一次循環
            }
            }
            // 全部執行完就自動退出程序

            先不談線程開銷這類的, 這個可讀性不是和要執行的任務更一致么?

              回復  更多評論   

            # re: 無聊之作 -- 延遲運行其他程序de程序 (C++版) 2009-08-14 11:00 Stupid ET

            @11
            好多牛人....
              回復  更多評論   

            # re: 無聊之作 -- 延遲運行其他程序de程序 (C++版) 2009-08-14 12:03 OwnWaterloo

            @11
            @11
            >Sleep(10); //10毫秒,可以根據需要的精度調整此檢查頻率
            嘿嘿, 是不是我需要更高精度的時候, 應該Sleep(5); ???

            你看看這個:
            999...999 a_long_delay_work.exe

            還覺得你那個方法“效率高”?
            你想想"可以根據需要的精度調整此檢查頻率"這句話, 當需要的精度要求達到極限時, 比如Sleep(0); 那個while是不是一個"忙等"?
            你以為Sleep沒有開銷嗎? 還Sleep(10)呢, 哈哈哈。


            你的代碼簡單嗎? 全都是偽代碼。
            而且我也說了, OS調度里面, 這些代碼都有, 你老人家何苦要去和它爭呢?
            就這Sleep(10) , 還爭什么呢爭……

            你這方案, 至少得算出到下一個任務開始前, 應該大致Sleep多久, 它才不算一個忙等。

            -------- --------
            而且, 這方案還必須是“先得到所有任務”, 再跑這個半死循環, 才可以。
            如果需要再跑半死循環的中途, 新建定時任務呢?
            這需求很常見, 很多類似“記事簿”的軟件都要提供這功能, 而且是隨時插入新的任務。

            顯然, 你必須至少要開2個線程了, 1個用于用戶輸入, 1個用來跑半死循環。
            “任務隊列”現在被2線程共享, 又需要加鎖來同步。
            這就是我說的, 自己調度會造成編碼復雜的原因, 懂?


            別人的方案有何優勢與劣勢?
            如此多的方案,它們各自何種情況下是最佳方式?
            想過沒? 同學?
            不要想都不想——如果Sleep(10)就是你想的結果, 那我真沒什么必要和你繼續說下去了……——就隨便扣個帽子, 你以為能顯示出你很能嗎?  回復  更多評論   

            # re: 無聊之作 -- 延遲運行其他程序de程序 (C++版) 2009-08-14 13:21 passing

            @OwnWaterloo
            淡定淡定
            不要折騰  回復  更多評論   

            # re: 無聊之作 -- 延遲運行其他程序de程序 (C++版) 2009-08-14 14:24 11

            設計根據需求而定, 這個程序明顯是不需要運行中提供輸入輸出的。只所以用偽代碼只是為了說明思路。if的前面省略了更新時間標志的代碼,我以為你會知道。

            以固定的時間間隔來等是有效率上的問題(應該等待下一個到這一個的間隔),但是就這個應用來說根本用不到很大的精度。 你也說了,多線程中操作系統也需要這樣的操作,難道你覺得有幾個任務要執行就開幾個線程來等待比一個線程的等待更高效?  回復  更多評論   

            # re: 無聊之作 -- 延遲運行其他程序de程序 (C++版) 2009-08-14 15:40 OwnWaterloo

            @11
            > 但是就這個應用來說根本用不到很大的精度

            扯談!

            那可不可以說“就這個應用根本不需要考慮效率”?
            使用多線程(線程池都免了)的效率完全足夠, 并且——我一直強調的——它編碼簡單, 充分利用"OS已經實現的調度機制",而不是自己重復去發明一套弱小的調度功能。


            一上來就拋出一句“典型濫用xxx”, 提出一個所謂的解決方案。
            典型的“什么事都想靠自己解決”的初級程序員作法。
              回復  更多評論   

            # re: 無聊之作 -- 延遲運行其他程序de程序 (C++版) 2009-08-15 15:45 Stupid ET

            其實這個程序只是當時剛剛接觸多線程這樣東西時來應用一下多線程...沒想到引發那么多爭論..........感慨感慨...  回復  更多評論   

            久久精品青青草原伊人| 久久99精品国产99久久| 一本大道久久东京热无码AV| 中文成人久久久久影院免费观看| 亚洲伊人久久精品影院| 久久天天躁狠狠躁夜夜躁2O2O| 情人伊人久久综合亚洲| 久久91精品国产91| 国产精品久久免费| 无码任你躁久久久久久老妇App| 国产亚洲精品自在久久| 久久综合伊人77777| 72种姿势欧美久久久久大黄蕉 | 人妻无码久久精品| 午夜欧美精品久久久久久久| 狠狠精品久久久无码中文字幕 | 欧美一级久久久久久久大片| AV狠狠色丁香婷婷综合久久| 精品久久久一二三区| 国产精品亚洲美女久久久| 久久精品蜜芽亚洲国产AV| 久久久精品视频免费观看| 久久成人国产精品二三区| 国产美女亚洲精品久久久综合| 精品久久久无码中文字幕天天| 久久久久亚洲AV无码永不| 久久亚洲精品成人无码网站| AA级片免费看视频久久| 国产精品久久久久久影院| 亚洲级αV无码毛片久久精品 | 精品精品国产自在久久高清| 热re99久久精品国99热| 久久久国产精华液| 欧美一区二区久久精品| 久久亚洲电影| 亚洲精品午夜国产va久久| 久久久久亚洲精品男人的天堂| 久久精品国产精品亜洲毛片 | 无码人妻久久一区二区三区免费 | 日韩人妻无码精品久久免费一| 国产欧美久久久精品影院|