C++/MFC-多线程

来源:互联网 发布:软件交易平台哪个最好 编辑:程序博客网 时间:2024/06/11 13:30

在一个进程中创建多个线程。

一、对话框设置

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_SUSPENDEDSetThreadPriority(tHandlethread[i],THREAD_PRIORITY_IDLE);i++;tHandlethread[i]=CreateThread(NULL,0,ThreadProc,&m_edt_time2,CREATE_SUSPENDED,&tid[i]);//CREATE_SUSPENDEDSetThreadPriority(tHandlethread[i],THREAD_PRIORITY_LOWEST);i++;tHandlethread[i]=CreateThread(NULL,0,ThreadProc,&m_edt_time3,CREATE_SUSPENDED,&tid[i]);//CREATE_SUSPENDEDSetThreadPriority(tHandlethread[i],THREAD_PRIORITY_BELOW_NORMAL);i++;tHandlethread[i]=CreateThread(NULL,0,ThreadProc,&m_edt_time4,CREATE_SUSPENDED,&tid[i]);//CREATE_SUSPENDEDSetThreadPriority(tHandlethread[i],THREAD_PRIORITY_NORMAL);i++;tHandlethread[i]=CreateThread(NULL,0,ThreadProc,&m_edt_time5,CREATE_SUSPENDED,&tid[i]);//CREATE_SUSPENDEDSetThreadPriority(tHandlethread[i],THREAD_PRIORITY_ABOVE_NORMAL);i++;tHandlethread[i]=CreateThread(NULL,0,ThreadProc,&m_edt_time6,CREATE_SUSPENDED,&tid[i]);//CREATE_SUSPENDEDSetThreadPriority(tHandlethread[i],THREAD_PRIORITY_HIGHEST);i++;tHandlethread[i]=CreateThread(NULL,0,ThreadProc,&m_edt_time7,CREATE_SUSPENDED,&tid[i]);//CREATE_SUSPENDEDSetThreadPriority(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,优先级等。




原创粉丝点击