作者slimbody15 (~只愛Leah Dizon~)
看板C_and_CPP
標題[問題] 有關VC上多執行緒的問題
時間Mon Nov 22 22:03:18 2010
( *[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