[問題] 執行緒問題

看板C_and_CPP作者 (chec)時間7年前 (2017/04/11 16:34), 7年前編輯推噓9(9021)
留言30則, 9人參與, 最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) windows 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) vs2015 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) qt5.7 問題(Question): 目前會有一個功能用到7z.exe去壓縮某個資料夾的檔案(壓成ZIP) 壓完之後馬上上傳 但好像因為執行的時間 所以壓縮之後要Sleep(2000) 睡大概兩秒 但Sleep好像是整個程式都會睡著 目前這個function是用QTimer去執行的 請問有其他辦法可以解決這個停頓嗎 用Sleep好像注定會延遲 這樣我有其他辦法等待EXE把檔案壓成ZIP這段時間嗎 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.124.46.66 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1491899642.A.368.html ※ 編輯: checkIO (59.124.46.66), 04/11/2017 16:34:46 ※ 編輯: checkIO (59.124.46.66), 04/11/2017 16:52:27

04/11 18:31, , 1F
所以有 sleep, Sleep, and SLEEP?
04/11 18:31, 1F
Sleep

04/11 18:37, , 2F
寫在執行7.zip副程式最後面?
04/11 18:37, 2F
跑到我上傳那行的瞬間不一定會壓完zip

04/11 18:41, , 3F
Sleep: sleep a sound sleep
04/11 18:41, 3F

04/11 18:41, , 4F
SLEEP: sleep like hell (ignores SIGKILL)
04/11 18:41, 4F

04/11 20:19, , 5F
在main thread sleep, 會讓 windows event 無法處理
04/11 20:19, 5F

04/11 21:14, , 6F
用 sleep 就錯了, 先討論執行外部程式的方法吧
04/11 21:14, 6F
討論的意思是 壓縮的時機嗎?

04/11 22:37, , 7F
就我的經驗 程式會需要睡覺通常是從設計上就有問題
04/11 22:37, 7F

04/11 22:38, , 8F
然後看到:「但好像...」 我就覺得你更不該用 Sleep
04/11 22:38, 8F
是因為這句話 我不知道Sleep是在做啥而在玩火嗎

04/11 22:40, , 9F
Compressing 應該是一個 blocking operations
04/11 22:40, 9F

04/11 22:40, , 10F
你大可等待返回值再決定下一步 而不是用等待
04/11 22:40, 10F

04/11 22:42, , 11F
if (compress_file(...) != OK) xxx then yyy; 之類
04/11 22:42, 11F

04/11 22:43, , 12F
重點是為什麼你一定要等兩秒?
04/11 22:43, 12F
因為我不確定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

04/11 22:55, , 13F
ㄜ 這種代碼暫時用勉強可以 但是你 zip 那邊怎麼寫
04/11 22:55, 13F

04/11 22:56, , 14F
我猜你大 call 了一個 shell 到外面去平行執行了?
04/11 22:56, 14F
yes 我用cmd call 7z.exe去壓縮某個資料夾內部的所有檔案

04/11 22:57, , 15F
我是我記得 system() 不是阻塞的?至少在 Linux 是
04/11 22:57, 15F

04/12 00:02, , 16F
system 是阻塞的沒錯,但也有非阻塞的背景執行,如WinExe
04/12 00:02, 16F

04/12 00:02, , 17F
c。原po呼叫7z壓縮變非阻塞是怎回事?
04/12 00:02, 17F

04/12 00:04, , 18F
直接讓她block 不就好了 為啥要non block又busy waitin
04/12 00:04, 18F

04/12 00:04, , 19F
g ....
04/12 00:04, 19F
因為我上傳是背景上傳 USER可能會在那段時間去操作UI 所以用了Sleep對ui操作會非常有感覺的頓...

04/12 09:55, , 20F
sleep就整個ui死掉啦
04/12 09:55, 20F
這樣請問Sleep到底是準備用在? ※ 編輯: checkIO (59.124.46.82), 04/12/2017 13:23:26

04/12 14:40, , 21F
就不接受打擾的時候阿
04/12 14:40, 21F

04/13 00:42, , 22F
不太懂 上傳直接接在blocking 的壓縮後面不行麼? 還是
04/13 00:42, 22F

04/13 00:42, , 23F
壓縮沒有另外的thread 會卡住整個程式?
04/13 00:42, 23F

04/13 00:42, , 24F
或是用conditional variable 讓壓縮完以後去把上傳的th
04/13 00:42, 24F

04/13 00:42, , 25F
read 叫醒
04/13 00:42, 25F

04/16 03:55, , 26F
如果你的壓縮是整個動作的最後一步,其實就是要讓它卡!
04/16 03:55, 26F

04/16 03:55, , 27F
頂多跑一個在跑的訊息條dialog讓user知道還沒跑完。如果
04/16 03:55, 27F

04/16 03:55, , 28F
要壓很久,再考慮開thread,並在跳出來的dialog上加上can
04/16 03:55, 28F

04/16 03:55, , 29F
cel按鈕,一般設計是這樣。
04/16 03:55, 29F
不是 是壓完之後要直接上傳到SERVER 但今天接上主程式的時候發現我的作法會出現記憶體讀取錯誤... ※ 編輯: checkIO (1.160.87.49), 04/17/2017 20:42:13

04/29 20:08, , 30F
可以用 QProcess 開 7z.exe
04/29 20:08, 30F
文章代碼(AID): #1Ox9JwDe (C_and_CPP)