在一个进程中创建多个线程。
一、对话框设置
1.1添加7个Cstatic,及7个CEdit控件
1.2CEdit控件 绑定7个UINT类型的值变量 m_edt_time1至m_edt_time7
1.3添加3个CButton控件 分别为CreateThread SuspendThread ResumeThread
二、回掉函数
#define WM_USER_MSGWM_USER+1//自定义消息
DWORD WINAPI ThreadProc(
LPVOID lpParameter // thread data
)
{
UINT* i=(UINT*)lpParameter;//因为绑定的是7个UINT类型的值变量
int Num=0;
while(1)
{
*i=(*i)++;
for (int j=0;j<=0x1FFFFFF;j++)//为了增加CPU负重,便于观察
{
Num+=j;
}
AfxGetApp()->m_pMainWnd->SendMessage(WM_USER_MSG,0,0);//发送消息,故需要一个接收消息的函数
Sleep(20);//暂时冻结此线程毫秒让出时间片
}
return Num;
}
三、存放线程信息
在相关的.h文件中:
HANDLE tHandlethread[7];//线程句柄
DWORD tid[7];//线程ID
四、创建线程
创建7个线程:null,0,回掉函数,创建的对象,优先级,类型,ID
int i=0;
tHandlethread[i]=CreateThread(NULL,0,ThreadProc,&m_edt_time1,CREATE_SUSPENDED,&tid[i]);//CREATE_SUSPENDED
SetThreadPriority(tHandlethread[i],THREAD_PRIORITY_IDLE);
i++;
tHandlethread[i]=CreateThread(NULL,0,ThreadProc,&m_edt_time2,CREATE_SUSPENDED,&tid[i]);//CREATE_SUSPENDED
SetThreadPriority(tHandlethread[i],THREAD_PRIORITY_LOWEST);
i++;
tHandlethread[i]=CreateThread(NULL,0,ThreadProc,&m_edt_time3,CREATE_SUSPENDED,&tid[i]);//CREATE_SUSPENDED
SetThreadPriority(tHandlethread[i],THREAD_PRIORITY_BELOW_NORMAL);
i++;
tHandlethread[i]=CreateThread(NULL,0,ThreadProc,&m_edt_time4,CREATE_SUSPENDED,&tid[i]);//CREATE_SUSPENDED
SetThreadPriority(tHandlethread[i],THREAD_PRIORITY_NORMAL);
i++;
tHandlethread[i]=CreateThread(NULL,0,ThreadProc,&m_edt_time5,CREATE_SUSPENDED,&tid[i]);//CREATE_SUSPENDED
SetThreadPriority(tHandlethread[i],THREAD_PRIORITY_ABOVE_NORMAL);
i++;
tHandlethread[i]=CreateThread(NULL,0,ThreadProc,&m_edt_time6,CREATE_SUSPENDED,&tid[i]);//CREATE_SUSPENDED
SetThreadPriority(tHandlethread[i],THREAD_PRIORITY_HIGHEST);
i++;
tHandlethread[i]=CreateThread(NULL,0,ThreadProc,&m_edt_time7,CREATE_SUSPENDED,&tid[i]);//CREATE_SUSPENDED
SetThreadPriority(tHandlethread[i],THREAD_PRIORITY_TIME_CRITICAL);
五、消息相应函数
重写WindowProc即可
LRESULT CDialog_Thread_Priority_test::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类
if (message==WM_USER_MSG)
{
UpdateData(false);
}
return CDialog::WindowProc(message, wParam, lParam);
}
注意别忘了ResumeThread(tHandlethread[i]);,否则线程虽然创建了,但没有运行起来。
程序编号后,点击运行程序,但不要点对话框内的任何按键。先启动任务管理器,在详细信息中找到对应的进程。
右键-设置相关性,将CPU勾选为1个。在运行程序,此时,edit框中数值变化的差异较为明显。
六、查看线程
双击PrcView.exe,找到相应的进程
右键->Threads,即可查看各线程的ID,优先级等。