看板 C_and_CPP 關於我們 聯絡資訊
( *[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
purpose:你只要全部寫入[1-5]其中一種字?那何必開五個執行緒? 11/22 22:09
purpose:開一個執行緒去寫就好啦 11/22 22:09
cooper6334:你的thread裡是"將指標移至文件末尾進行追加" 11/22 22:10
抱歉 會問這個問題是因為上級要我了解執行緒的道理 要我寫5個執行緒去看txt檔寫入的資訊 他們有跟我說答案是1-5其中一組 而不會是從1排到5 謝謝各位 ※ 編輯: slimbody15 來自: 1.160.146.250 (11/22 22:12)
cooper6334:為啥只能有一組pattern? 11/22 22:11
slimbody15:c大 抱歉 這是上級要我寫出只能有一組pattern(1-5之一) 11/22 22:14
slimbody15:那他們是有跟我提示是跟append有關 不過小弟不大了解 11/22 22:15
slimbody15:謝謝回覆^^ 11/22 22:15
purpose:整個怪的要求。我猜是,每次點下按鈕,就新增五個執行緒寫 11/22 22:20
purpose:入一個新檔案(原本檔案有內容就蓋過),先寫的執行緒把檔案 11/22 22:21
purpose:鎖住,寫入完成才解除。其他執行緒在鎖住時要等待... 11/22 22:22
slimbody15:對 p大就是您說的這樣 想請教我這個code是錯在哪呢? 謝 11/22 22:23
cooper6334:問題就是在p大說的"原本檔案有內容就蓋過"阿 11/22 22:24
purpose:不用移動到檔案尾部,且要鎖住寫入控制權,看你要怎麼鎖 11/22 22:25
cooper6334:你沒蓋過而是寫在後面,那當然是變一長串 11/22 22:25
purpose:沒想到中華電信也有 1.x.x.x 開頭 IP,很特別 11/22 22:25
cooper6334:就同步問題阿,恐龍本CH6 11/22 22:26
slimbody15:感謝p大,c大 想請教鎖住寫入控制權這點 我有加cs.lock 11/22 22:27
cooper6334:設個boolen,有thread進去設成true,其他看到true則wait 11/22 22:27
slimbody15:請問 這不算嗎? 謝謝 11/22 22:27
slimbody15:不好意思 小弟是新手 如問了蠢問題 請諒解 謝謝 11/22 22:29
purpose:OK,我剛沒仔細看全部的程式碼,沒注意到你鎖了 11/22 22:32
purpose:CCriticalSection cs; 你應該設成 global 變數 11/22 22:34
slimbody15:OK p大感恩 ^^ 11/22 22:36
adks3489:回憶起當年的OS 11/23 08:46