cedricporter -- [ QQ: 414112390 ]
posted on 2009-08-13 11:38 Stupid ET 閱讀(2140) 評論(19) 編輯 收藏 引用 所屬分類: Language
想法很可愛 編程意識不錯(cuò),handle關(guān)閉的很及時(shí) 但是winexec這種東西少用 回復(fù) 更多評論
@pear_liwinexec怎么了? 回復(fù) 更多評論
> Sleep(InputHandle()+2000); // 主線程暫停等待其他線程運(yùn)行完畢 嚴(yán)格給的說, 要用 WaitForMultipleObjects。如果人品非常差, 延遲2秒還是有主線程先結(jié)束的可能, 因?yàn)檎{(diào)度順序是未知的。> 因?yàn)檎{(diào)度未知從CreateThread開始, 到次線程Sleep 之間會有未知時(shí)間的間隔。所以, 傳給次線程的, 不應(yīng)該是delay, 而是awake_time。次線程在Sleep前一刻, 根據(jù)awake_time和current_time, 計(jì)算Sleep多久。這樣, 精度就不受CreateThread,到Sleep之間那段未知時(shí)間的影響。如果精度還要提高, 可以用WaitableTimer。> CreateThread在vc上用_beginthreadex代替。 dev c++如果是用的mingw, 也有這個(gè)函數(shù)。最后一點(diǎn)………… 其實(shí)偷懶的話去查AT的用法 ……run -> cmd -> at /?直接寫個(gè)bat文件:at xxxx notepadat yyyy calc....而不用寫一個(gè)配置文件, 然后用一個(gè)程序去讀, 再執(zhí)行……功能差不多, 精度可能低一些。 回復(fù) 更多評論
高中生? 回復(fù) 更多評論
@OwnWaterloo哦, 原來是個(gè)backward compatibility函數(shù)…… 回復(fù) 更多評論
呃...曾經(jīng)是高中時(shí)寫的...從我的百度空間移過來的...@OwnWaterloo 回復(fù) 更多評論
典型的濫用多線程的例子。 直接讀取配置來一個(gè)排序, 以一個(gè)小的粒度檢查時(shí)間來運(yùn)行要運(yùn)行的程序就可以了。 回復(fù) 更多評論
哇..佩服佩服.....@OwnWaterloo 回復(fù) 更多評論
哦。恍然大悟,O(∩_∩)O謝謝...@11 回復(fù) 更多評論
@Stupid ET這些代碼是你高中寫的?? 牛……我覺得這思路挺好, 將n個(gè)任務(wù)分到不同線程, 然后用Sleep的方式通知OS。誰知道OS里面會不會有:“來一個(gè)排序, 以一個(gè)小的粒度檢查時(shí)間來運(yùn)行要運(yùn)行的”線程這種調(diào)度算法呢?誰知道OS會不會比ls某位的算法更差呢?誰知道windows下的創(chuàng)建線程開銷會比ls某位的算法高呢?這些都不知道, 要測也不方便。但是, 編碼簡單很多~~~ 同時(shí)線程間的同步也很方便處理。KISS~~~ 回復(fù) 更多評論
@OwnWaterloo 小菜我剛剛高中畢業(yè),以后多多指教哦... 回復(fù) 更多評論
1:WinExec 返回是進(jìn)程第一次調(diào)用GetMessage或者一個(gè)超時(shí),從這點(diǎn)出發(fā),還是不用WinExec為妙2:博主還沒處理空格符帶來的問題,WinExec填寫的參數(shù)是錯(cuò)誤的,例如有個(gè)程序是e:\Program.exe,你的QQ就被病毒給劫持了。3:主線程應(yīng)該調(diào)WaitForMultipleObjects4:用CreateProcess或者ShellExcute,前者可以順帶掛起進(jìn)程,后者可以直接運(yùn)行腳本或者打開文件。5:用腳本都可以實(shí)現(xiàn)的功能。 回復(fù) 更多評論
to OwnWaterloo:你真的以為線程同步比一個(gè)循環(huán)來得更簡單么? 很明顯的,啟動(dòng)那些程序不需要同時(shí)執(zhí)行,既然可以順序執(zhí)行, 為什么不順序執(zhí)行呢?我以為代碼是越簡單越好。這個(gè)里面只需要一個(gè) for或while循環(huán)就可以完成//任務(wù)列表按執(zhí)行先后排序//index = 0;//n = 任務(wù)的個(gè)數(shù)while(index < n) { //檢查 index 處的任務(wù)是否到了執(zhí)行時(shí)間 if(...)// 沒有到 { Sleep(10); //10毫秒,可以根據(jù)需要的精度調(diào)整此檢查頻率 } else { // 到了執(zhí)行, 然后遞增 index 進(jìn)入下一次循環(huán) }}// 全部執(zhí)行完就自動(dòng)退出程序先不談線程開銷這類的, 這個(gè)可讀性不是和要執(zhí)行的任務(wù)更一致么? 回復(fù) 更多評論
@11 好多牛人.... 回復(fù) 更多評論
@11@11>Sleep(10); //10毫秒,可以根據(jù)需要的精度調(diào)整此檢查頻率嘿嘿, 是不是我需要更高精度的時(shí)候, 應(yīng)該Sleep(5); ???你看看這個(gè):999...999 a_long_delay_work.exe還覺得你那個(gè)方法“效率高”?你想想"可以根據(jù)需要的精度調(diào)整此檢查頻率"這句話, 當(dāng)需要的精度要求達(dá)到極限時(shí), 比如Sleep(0); 那個(gè)while是不是一個(gè)"忙等"?你以為Sleep沒有開銷嗎? 還Sleep(10)呢, 哈哈哈。你的代碼簡單嗎? 全都是偽代碼。而且我也說了, OS調(diào)度里面, 這些代碼都有, 你老人家何苦要去和它爭呢?就這Sleep(10) , 還爭什么呢爭……你這方案, 至少得算出到下一個(gè)任務(wù)開始前, 應(yīng)該大致Sleep多久, 它才不算一個(gè)忙等。-------- --------而且, 這方案還必須是“先得到所有任務(wù)”, 再跑這個(gè)半死循環(huán), 才可以。如果需要再跑半死循環(huán)的中途, 新建定時(shí)任務(wù)呢?這需求很常見, 很多類似“記事簿”的軟件都要提供這功能, 而且是隨時(shí)插入新的任務(wù)。顯然, 你必須至少要開2個(gè)線程了, 1個(gè)用于用戶輸入, 1個(gè)用來跑半死循環(huán)。“任務(wù)隊(duì)列”現(xiàn)在被2線程共享, 又需要加鎖來同步。這就是我說的, 自己調(diào)度會造成編碼復(fù)雜的原因, 懂?別人的方案有何優(yōu)勢與劣勢?如此多的方案,它們各自何種情況下是最佳方式?想過沒? 同學(xué)?不要想都不想——如果Sleep(10)就是你想的結(jié)果, 那我真沒什么必要和你繼續(xù)說下去了……——就隨便扣個(gè)帽子, 你以為能顯示出你很能嗎? 回復(fù) 更多評論
@OwnWaterloo 淡定淡定 不要折騰 回復(fù) 更多評論
設(shè)計(jì)根據(jù)需求而定, 這個(gè)程序明顯是不需要運(yùn)行中提供輸入輸出的。只所以用偽代碼只是為了說明思路。if的前面省略了更新時(shí)間標(biāo)志的代碼,我以為你會知道。以固定的時(shí)間間隔來等是有效率上的問題(應(yīng)該等待下一個(gè)到這一個(gè)的間隔),但是就這個(gè)應(yīng)用來說根本用不到很大的精度。 你也說了,多線程中操作系統(tǒng)也需要這樣的操作,難道你覺得有幾個(gè)任務(wù)要執(zhí)行就開幾個(gè)線程來等待比一個(gè)線程的等待更高效? 回復(fù) 更多評論
@11> 但是就這個(gè)應(yīng)用來說根本用不到很大的精度扯談!那可不可以說“就這個(gè)應(yīng)用根本不需要考慮效率”?使用多線程(線程池都免了)的效率完全足夠, 并且——我一直強(qiáng)調(diào)的——它編碼簡單, 充分利用"OS已經(jīng)實(shí)現(xiàn)的調(diào)度機(jī)制",而不是自己重復(fù)去發(fā)明一套弱小的調(diào)度功能。一上來就拋出一句“典型濫用xxx”, 提出一個(gè)所謂的解決方案。典型的“什么事都想靠自己解決”的初級程序員作法。 回復(fù) 更多評論
其實(shí)這個(gè)程序只是當(dāng)時(shí)剛剛接觸多線程這樣?xùn)|西時(shí)來應(yīng)用一下多線程...沒想到引發(fā)那么多爭論..........感慨感慨... 回復(fù) 更多評論
Powered by: C++博客 Copyright © Stupid ET