[問題] 有關VC上多執行緒的問題

看板C_and_CPP作者 (~只愛Leah Dizon~)時間13年前 (2010/11/22 22:03), 編輯推噓7(7017)
留言24則, 4人參與, 最新討論串1/2 (看更多)
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 小弟用VC寫一個多執行緒的視窗程式,程式是寫入檔案的應用, 我寫了5個work function, 第一個work function為寫入10個1到txt檔 第二個work function為寫入10個2到txt檔 第三個work function為寫入10個3到txt檔 第四個work function為寫入10個4到txt檔 第五個work function為寫入10個5到txt檔 這5個function我將他們給work thread執行 而這5個work thread則給視窗上一個按鈕觸發 意即按了那個按鈕 就會執行將檔案寫入選定txt檔的動作 希望得到的正確結果: txt檔裡面的寫入資料只能有一組pattern 即1111111111 or 2222222222 or 333333333 or 444444444 or 5555555555 程式跑出來的錯誤結果: 程式跑出來 txt檔卻是(不一定按照以下順序 但是必定有5組) 111111111122222222223333333334444444445555555555 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) vc++ 使用vc6 有問題的code: (請善用置底文標色功能) void CTest1117Dlg::OnWrite() { int i=1; theApp.m_pThreads[0]=AfxBeginThread(WorkerThreadFunction_1,(LPVOID)i); Sleep(100); i=2; theApp.m_pThreads[1]=AfxBeginThread(WorkerThreadFunction_2,(LPVOID)i); Sleep(100); i=3; theApp.m_pThreads[2]=AfxBeginThread(WorkerThreadFunction_3,(LPVOID)i); Sleep(100); i=4; theApp.m_pThreads[3]=AfxBeginThread(WorkerThreadFunction_4,(LPVOID)i); Sleep(100); i=5; theApp.m_pThreads[4]=AfxBeginThread(WorkerThreadFunction_5,(LPVOID)i); Sleep(100); } 補充說明: 補充WorkerThreadFunction_1的定義 /////////////////////////////////////////// UINT CTest1117Dlg::WorkerThreadFunction_1(LPVOID pParam) /////////////////////////////////////////// { CFile file; CCriticalSection cs; cs.Lock(); file.Open(dpath,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite); CString strValue ; for(int i=1;i<100;i++) { file.SeekToEnd(); //將指標移至文件末尾進行追加 strValue="1"; file.Write(strValue,strValue.GetLength()); } //關閉文件 file.Close(); cs.Unlock(); return 0; } 懇請版上朋友不吝指教小弟錯誤的地方 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.160.146.250

11/22 22:09, , 1F
你只要全部寫入[1-5]其中一種字?那何必開五個執行緒?
11/22 22:09, 1F

11/22 22:09, , 2F
開一個執行緒去寫就好啦
11/22 22:09, 2F

11/22 22:10, , 3F
你的thread裡是"將指標移至文件末尾進行追加"
11/22 22:10, 3F
抱歉 會問這個問題是因為上級要我了解執行緒的道理 要我寫5個執行緒去看txt檔寫入的資訊 他們有跟我說答案是1-5其中一組 而不會是從1排到5 謝謝各位 ※ 編輯: slimbody15 來自: 1.160.146.250 (11/22 22:12)

11/22 22:11, , 4F
為啥只能有一組pattern?
11/22 22:11, 4F

11/22 22:14, , 5F
c大 抱歉 這是上級要我寫出只能有一組pattern(1-5之一)
11/22 22:14, 5F

11/22 22:15, , 6F
那他們是有跟我提示是跟append有關 不過小弟不大了解
11/22 22:15, 6F

11/22 22:15, , 7F
謝謝回覆^^
11/22 22:15, 7F

11/22 22:20, , 8F
整個怪的要求。我猜是,每次點下按鈕,就新增五個執行緒寫
11/22 22:20, 8F

11/22 22:21, , 9F
入一個新檔案(原本檔案有內容就蓋過),先寫的執行緒把檔案
11/22 22:21, 9F

11/22 22:22, , 10F
鎖住,寫入完成才解除。其他執行緒在鎖住時要等待...
11/22 22:22, 10F

11/22 22:23, , 11F
對 p大就是您說的這樣 想請教我這個code是錯在哪呢? 謝
11/22 22:23, 11F

11/22 22:24, , 12F
問題就是在p大說的"原本檔案有內容就蓋過"阿
11/22 22:24, 12F

11/22 22:25, , 13F
不用移動到檔案尾部,且要鎖住寫入控制權,看你要怎麼鎖
11/22 22:25, 13F

11/22 22:25, , 14F
你沒蓋過而是寫在後面,那當然是變一長串
11/22 22:25, 14F

11/22 22:25, , 15F
沒想到中華電信也有 1.x.x.x 開頭 IP,很特別
11/22 22:25, 15F

11/22 22:26, , 16F
就同步問題阿,恐龍本CH6
11/22 22:26, 16F

11/22 22:27, , 17F
感謝p大,c大 想請教鎖住寫入控制權這點 我有加cs.lock
11/22 22:27, 17F

11/22 22:27, , 18F
設個boolen,有thread進去設成true,其他看到true則wait
11/22 22:27, 18F

11/22 22:27, , 19F
請問 這不算嗎? 謝謝
11/22 22:27, 19F

11/22 22:29, , 20F
不好意思 小弟是新手 如問了蠢問題 請諒解 謝謝
11/22 22:29, 20F

11/22 22:32, , 21F
OK,我剛沒仔細看全部的程式碼,沒注意到你鎖了
11/22 22:32, 21F

11/22 22:34, , 22F
CCriticalSection cs; 你應該設成 global 變數
11/22 22:34, 22F

11/22 22:36, , 23F
OK p大感恩 ^^
11/22 22:36, 23F

11/23 08:46, , 24F
回憶起當年的OS
11/23 08:46, 24F
文章代碼(AID): #1CwdWeIe (C_and_CPP)
文章代碼(AID): #1CwdWeIe (C_and_CPP)