前两次学习都是只创建一个线程
这次我们写一个多线程的模拟器
下面我们将认识两个函数
DWORD SuspendThread(HANDLE hThread);
这个函数是将线程挂起,也就是暂停的意思
参数 hThread 是线程句柄
线程挂起之后需要调用另一个函数将线程唤醒
DWORD ResumeThread(HANDLE hThread);
参数hThread是一样的意思。不解释不解释
用MFC创建一个下图所示的 对话框
先 打开ClassWizaid 在 menber variables 里面 给三个进度条添加控件变量
分别为如下图所示
然后给各个按钮一次添加ID号码
IDC_ALL_START , IDC_STOP1,IDC_STOP2 , IDC_STOP3 , IDC_START1 , IDC_START2 , IDC_START3
然后双击各个按钮添加函数
我们按照上次的步骤在 类的头文件里面加入(类外面添加函数的申明)
void func1(LPVOID cpro1);
void func2(LPVOID cpro2);
void func3(LPVOID cpro3);
然后再 类里面添加 下面的私有变量
线程函数添加下面代码
void func1(LPVOID cpro1)
{
CProgressCtrl *pro = (CProgressCtrl *)cpro1 ;
for (int i = 0 ; ; ++i )
{
i = i % 10 ;
pro->SetPos(i);
Sleep(1000);
}
}
void func2(LPVOID cpro2)
{
CProgressCtrl *pro = (CProgressCtrl *)cpro2 ;
for (int i = 0 ; ; ++i )
{
i = i % 10 ;
pro->SetPos(i);
Sleep(1000);
}
}
void func3(LPVOID cpro3)
{
CProgressCtrl *pro = (CProgressCtrl *)cpro3 ;
for (int i = 0 ; ; ++i )
{
i = i % 10 ;
pro->SetPos(i);
Sleep(1000);
}
}
按钮函数添加下面代码
void CThread3_1Dlg::OnAllStart()
{
// TODO: Add your control notification handler code here
thread1 = CreateThread( NULL , 0 , (LPTHREAD_START_ROUTINE)func1, &m_pro1 , 0 , &threadid1 );
thread2 = CreateThread( NULL , 0 , (LPTHREAD_START_ROUTINE)func2, &m_pro2 , 0 , &threadid2 );
thread3 = CreateThread( NULL , 0 , (LPTHREAD_START_ROUTINE)func3, &m_pro3 , 0 , &threadid3 );
GetDlgItem(IDC_ALL_START)->EnableWindow(false);
GetDlgItem(IDC_STOP1)->EnableWindow(true);
GetDlgItem(IDC_STOP2)->EnableWindow(true);
GetDlgItem(IDC_STOP3)->EnableWindow(true);
}
void CThread3_1Dlg::OnStart3()
{
// TODO: Add your control notification handler code here
ResumeThread(thread3);
GetDlgItem(IDC_STOP3)->EnableWindow(true);
GetDlgItem(IDC_START3)->EnableWindow(false);
}
void CThread3_1Dlg::OnStart1()
{
// TODO: Add your control notification handler code here
ResumeThread(thread1);
GetDlgItem(IDC_STOP1)->EnableWindow(true);
GetDlgItem(IDC_START1)->EnableWindow(false);
}
void CThread3_1Dlg::OnStart2()
{
// TODO: Add your control notification handler code here
ResumeThread(thread2);
GetDlgItem(IDC_STOP2)->EnableWindow(true);
GetDlgItem(IDC_START2)->EnableWindow(false);
}
void CThread3_1Dlg::OnStop1()
{
// TODO: Add your control notification handler code here
SuspendThread(thread1);
GetDlgItem(IDC_START1)->EnableWindow(true);
GetDlgItem(IDC_STOP1)->EnableWindow(false);
}
void CThread3_1Dlg::OnStop2()
{
// TODO: Add your control notification handler code here
SuspendThread(thread2);
GetDlgItem(IDC_START2)->EnableWindow(true);
GetDlgItem(IDC_STOP2)->EnableWindow(false);
}
void CThread3_1Dlg::OnStop3()
{
// TODO: Add your control notification handler code here
SuspendThread(thread3);
GetDlgItem(IDC_START3)->EnableWindow(true);
GetDlgItem(IDC_STOP3)->EnableWindow(false);
}
添加之后
最后在 初始化函数里面添加
m_pro1.SetRange(0 , 10 );
m_pro2.SetRange( 0 , 10 );
m_pro3.SetRange(0 , 10) ;
GetDlgItem(IDC_START1)->EnableWindow(false);
GetDlgItem(IDC_START2)->EnableWindow(false);
GetDlgItem(IDC_START3)->EnableWindow(false);
GetDlgItem(IDC_STOP1)->EnableWindow(false);
GetDlgItem(IDC_STOP2)->EnableWindow(false);
GetDlgItem(IDC_STOP3)->EnableWindow(false);
编译运行
就可以操纵几个线程工作了
下面是截图
最后 源代码 的下载地址如下所示:
http://download.csdn.net/detail/midle110/4412744