cedricporter -- [ QQ: 414112390 ]
posted on 2009-08-13 11:38 Stupid ET 閱讀(2138) 評論(19) 編輯 收藏 引用 所屬分類: Language
想法很可愛 編程意識不錯,handle關閉的很及時 但是winexec這種東西少用 回復 更多評論
@pear_liwinexec怎么了? 回復 更多評論
> 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 notepadat yyyy calc....而不用寫一個配置文件, 然后用一個程序去讀, 再執行……功能差不多, 精度可能低一些。 回復 更多評論
高中生? 回復 更多評論
@OwnWaterloo哦, 原來是個backward compatibility函數…… 回復 更多評論
呃...曾經是高中時寫的...從我的百度空間移過來的...@OwnWaterloo 回復 更多評論
典型的濫用多線程的例子。 直接讀取配置來一個排序, 以一個小的粒度檢查時間來運行要運行的程序就可以了。 回復 更多評論
哇..佩服佩服.....@OwnWaterloo 回復 更多評論
哦。恍然大悟,O(∩_∩)O謝謝...@11 回復 更多評論
@Stupid ET這些代碼是你高中寫的?? 牛……我覺得這思路挺好, 將n個任務分到不同線程, 然后用Sleep的方式通知OS。誰知道OS里面會不會有:“來一個排序, 以一個小的粒度檢查時間來運行要運行的”線程這種調度算法呢?誰知道OS會不會比ls某位的算法更差呢?誰知道windows下的創建線程開銷會比ls某位的算法高呢?這些都不知道, 要測也不方便。但是, 編碼簡單很多~~~ 同時線程間的同步也很方便處理。KISS~~~ 回復 更多評論
@OwnWaterloo 小菜我剛剛高中畢業,以后多多指教哦... 回復 更多評論
1:WinExec 返回是進程第一次調用GetMessage或者一個超時,從這點出發,還是不用WinExec為妙2:博主還沒處理空格符帶來的問題,WinExec填寫的參數是錯誤的,例如有個程序是e:\Program.exe,你的QQ就被病毒給劫持了。3:主線程應該調WaitForMultipleObjects4:用CreateProcess或者ShellExcute,前者可以順帶掛起進程,后者可以直接運行腳本或者打開文件。5:用腳本都可以實現的功能。 回復 更多評論
to OwnWaterloo:你真的以為線程同步比一個循環來得更簡單么? 很明顯的,啟動那些程序不需要同時執行,既然可以順序執行, 為什么不順序執行呢?我以為代碼是越簡單越好。這個里面只需要一個 for或while循環就可以完成//任務列表按執行先后排序//index = 0;//n = 任務的個數while(index < n) { //檢查 index 處的任務是否到了執行時間 if(...)// 沒有到 { Sleep(10); //10毫秒,可以根據需要的精度調整此檢查頻率 } else { // 到了執行, 然后遞增 index 進入下一次循環 }}// 全部執行完就自動退出程序先不談線程開銷這類的, 這個可讀性不是和要執行的任務更一致么? 回復 更多評論
@11 好多牛人.... 回復 更多評論
@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)就是你想的結果, 那我真沒什么必要和你繼續說下去了……——就隨便扣個帽子, 你以為能顯示出你很能嗎? 回復 更多評論
@OwnWaterloo 淡定淡定 不要折騰 回復 更多評論
設計根據需求而定, 這個程序明顯是不需要運行中提供輸入輸出的。只所以用偽代碼只是為了說明思路。if的前面省略了更新時間標志的代碼,我以為你會知道。以固定的時間間隔來等是有效率上的問題(應該等待下一個到這一個的間隔),但是就這個應用來說根本用不到很大的精度。 你也說了,多線程中操作系統也需要這樣的操作,難道你覺得有幾個任務要執行就開幾個線程來等待比一個線程的等待更高效? 回復 更多評論
@11> 但是就這個應用來說根本用不到很大的精度扯談!那可不可以說“就這個應用根本不需要考慮效率”?使用多線程(線程池都免了)的效率完全足夠, 并且——我一直強調的——它編碼簡單, 充分利用"OS已經實現的調度機制",而不是自己重復去發明一套弱小的調度功能。一上來就拋出一句“典型濫用xxx”, 提出一個所謂的解決方案。典型的“什么事都想靠自己解決”的初級程序員作法。 回復 更多評論
其實這個程序只是當時剛剛接觸多線程這樣東西時來應用一下多線程...沒想到引發那么多爭論..........感慨感慨... 回復 更多評論
Powered by: C++博客 Copyright © Stupid ET