大神幫忙,我在百度也好,反正找變了,MFC多執行緒怎么也不成功
例程10 MultiThread10
建立一個基于對話框的工程MultiThread10,在對話框IDD_MULTITHREAD10_DIALOG中加入一個按鈕和三個編輯框控制元件,按鈕的ID為IDC_START,標題為“同時寫‘A’、‘B’、‘C’”;三個編輯框的ID分別為IDC_A、IDC_B和IDC_C,屬性都選中Read-only;
在MultiThread10Dlg.h檔案中宣告兩個執行緒函式:
UINT WriteA(LPVOID pParam);
UINT WriteB(LPVOID pParam);
UINT WriteC(LPVOID pParam);
使用ClassWizard分別給IDC_A、IDC_B和IDC_C添加CEdit類變數m_ctrlA、m_ctrlB和m_ctrlC;
在MultiThread10Dlg.cpp檔案中添加如下內容:
為了檔案中能夠正確使用同步類,在檔案開頭添加:
#include "afxmt.h"
定義信號量物件和一個字符陣列,為了能夠在不同執行緒間使用,定義為全域變數:
CSemaphore semaphoreWrite(2,2); //資源最多訪問執行緒2個,當前可訪問執行緒數2個
char g_Array[10];
添加三個執行緒函式:
UINT WriteA(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
CString str;
for(int i=0;i<10;i++)
{
pEdit->GetWindowText(str);
g_Array[i]=''A'';
str=str+g_Array[i];
pEdit->SetWindowText(str);
Sleep(1000);
}
ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
return 0;
}
UINT WriteB(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
CString str;
for(int i=0;i<10;i++)
{
pEdit->GetWindowText(str);
g_Array[i]=''B'';
str=str+g_Array[i];
pEdit->SetWindowText(str);
Sleep(1000);
}
ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
return 0;
}
UINT WriteC(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
for(int i=0;i<10;i++)
{
g_Array[i]=''C'';
pEdit->SetWindowText(g_Array);
Sleep(1000);
}
ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
return 0;
}
這三個執行緒函式不再多說。在信號量物件有信號的狀態下,執行緒執行到WaitForSingleObject陳述句處繼續執行,同時可用執行緒數減1;若執行緒執行到WaitForSingleObject陳述句時信號量物件無信號,執行緒就在這里等待,直到信號量物件有信號執行緒才往下執行。
雙擊按鈕IDC_START,添加其回應函式:
void CMultiThread10Dlg::OnStart()
{
CWinThread *pWriteA=AfxBeginThread(WriteA,
&m_ctrlA,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteA->ResumeThread();
CWinThread *pWriteB=AfxBeginThread(WriteB,
&m_ctrlB,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteB->ResumeThread();
CWinThread *pWriteC=AfxBeginThread(WriteC,
&m_ctrlC,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteC->ResumeThread();
}
大神幫忙給詳細的改一下唄!
我的是這樣的





uj5u.com熱心網友回復:
類似的問題你是不是問過?uj5u.com熱心網友回復:
頭一次發帖啊。uj5u.com熱心網友回復:
《Windows核心編程》uj5u.com熱心網友回復:
執行緒函式中不要直接操作UI上的控制元件~uj5u.com熱心網友回復:
你執行緒中PostMessage到主執行緒來更新UI控制元件uj5u.com熱心網友回復:
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspxuj5u.com熱心網友回復:
操作UI最好交給訊息回應函式轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/109589.html
標籤:進程/線程/DLL
上一篇:MFC仿qq求助
下一篇:Inno Setup如何關閉行程
