推 Hazukashiine: 所以有 sleep, Sleep, and SLEEP? 04/11 18:31
Sleep
推 s4300026: 寫在執行7.zip副程式最後面? 04/11 18:37
跑到我上傳那行的瞬間不一定會壓完zip
→ MOONRAKER: Sleep: sleep a sound sleep 04/11 18:41
→ MOONRAKER: SLEEP: sleep like hell (ignores SIGKILL) 04/11 18:41
→ chengcti: 在main thread sleep, 會讓 windows event 無法處理 04/11 20:19
→ uranusjr: 用 sleep 就錯了, 先討論執行外部程式的方法吧 04/11 21:14
討論的意思是 壓縮的時機嗎?
推 Hazukashiine: 就我的經驗 程式會需要睡覺通常是從設計上就有問題 04/11 22:37
→ Hazukashiine: 然後看到:「但好像...」 我就覺得你更不該用 Sleep 04/11 22:38
是因為這句話 我不知道Sleep是在做啥而在玩火嗎
→ Hazukashiine: Compressing 應該是一個 blocking operations 04/11 22:40
→ Hazukashiine: 你大可等待返回值再決定下一步 而不是用等待 04/11 22:40
→ Hazukashiine: if (compress_file(...) != OK) xxx then yyy; 之類 04/11 22:42
→ Hazukashiine: 重點是為什麼你一定要等兩秒? 04/11 22:43
因為我不確定ZIP壓成功的時間 所以一定要等他
ZIP有壓成功 才能跑上傳 使用Sleep在那時候看起來最直覺...
如果我改成這樣 用while迴圈去確認檔案是否存在 存在才跳出迴圈呢
//call cmd 7z.exe to zip file and wait finished
int count = 0
bool zipFileExist = false
while(!zipFileExist){
count += 1
if(count %1000 == 0){
//check zip file exist;
if (file exist){
zipFileExist = true;
}
}
}
// do upLoad
→ Hazukashiine: ㄜ 這種代碼暫時用勉強可以 但是你 zip 那邊怎麼寫 04/11 22:55
→ Hazukashiine: 我猜你大 call 了一個 shell 到外面去平行執行了? 04/11 22:56
yes 我用cmd call 7z.exe去壓縮某個資料夾內部的所有檔案
→ Hazukashiine: 我是我記得 system() 不是阻塞的?至少在 Linux 是 04/11 22:57
推 EdisonX: system 是阻塞的沒錯,但也有非阻塞的背景執行,如WinExe 04/12 00:02
→ EdisonX: c。原po呼叫7z壓縮變非阻塞是怎回事? 04/12 00:02
推 steve1012: 直接讓她block 不就好了 為啥要non block又busy waitin 04/12 00:04
→ steve1012: g .... 04/12 00:04
因為我上傳是背景上傳
USER可能會在那段時間去操作UI 所以用了Sleep對ui操作會非常有感覺的頓...
推 HMKRL: sleep就整個ui死掉啦 04/12 09:55
這樣請問Sleep到底是準備用在?
※ 編輯: checkIO (59.124.46.82), 04/12/2017 13:23:26
→ MOONRAKER: 就不接受打擾的時候阿 04/12 14:40
推 steve1012: 不太懂 上傳直接接在blocking 的壓縮後面不行麼? 還是 04/13 00:42
→ steve1012: 壓縮沒有另外的thread 會卡住整個程式? 04/13 00:42
→ steve1012: 或是用conditional variable 讓壓縮完以後去把上傳的th 04/13 00:42
→ steve1012: read 叫醒 04/13 00:42
推 EdisonX: 如果你的壓縮是整個動作的最後一步,其實就是要讓它卡! 04/16 03:55
→ EdisonX: 頂多跑一個在跑的訊息條dialog讓user知道還沒跑完。如果 04/16 03:55
→ EdisonX: 要壓很久,再考慮開thread,並在跳出來的dialog上加上can 04/16 03:55
→ EdisonX: cel按鈕,一般設計是這樣。 04/16 03:55
不是 是壓完之後要直接上傳到SERVER
但今天接上主程式的時候發現我的作法會出現記憶體讀取錯誤...
※ 編輯: checkIO (1.160.87.49), 04/17/2017 20:42:13
推 rod4919: 可以用 QProcess 開 7z.exe 04/29 20:08