Windows *** 作系统是基于消息机制运作的。
Windows *** 作系统中为每个线程维护着一个消息池,
并且将收到的消息(比如鼠标点击、键盘按下)先存储到消息池中,
然后再不断地取出消息,传递给需要处理这个消息的函数(比如按钮按下的函数)。
一般,如果f1()、f2()处于同一个线程里时,按消息先后顺序触发对应的f1或f2。先被触发的运行结束后,另一个才被触发。
如果是处于两个不同线程的话,则消息到达后,立即触发对应的f1或f2,看似f1和f2同时在运行了。
一般应用程序默认是单线程的。
如果你需要多线程的话,需要进行额外的编程。(可以参考MSDN上MFC相关的多线程编程相关资料)
获取系统进程要使用CreateToolhelp32Snapshot()函数得到快照,然后进行遍历,取出自己想要的信息就可以了。下面是我自己写的一个由进程名称得到进程ID的函数,要得到所有的进程,你只要把循环进行完就行。上代码:
DWORD CXXXDlg::GetProeccIDByName(CString& csProName){
//AddOutPut()是我自己封装的调试函数,可以不用理会
//使用CreateToolhelp32Snapshot()等函数要包含头文件
//#include <TlHelp32h>
AddOutPut(_T("->由进程名字得到进程ID开始"));
if (csProNameIsEmpty())
{
AddOutPut(_T("!!由进程名字得到进程ID失败,进程ID名字为空!"));
return 0;
}
HANDLE hSnapShot = NULL;
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hSnapShot)
{
AddOutPut(_T("!!由进程名字得到进程ID失败,创建快照失败!"));
return 0;
}
int nPos = csProNameReverseFind('\\');
csProName = csProNameRight(csProNameGetLength() - nPos);
PROCESSENTRY32 proEntry32 = {0};
bool bRetval = false;
bool bFind = false;
proEntry32dwSize = sizeof(PROCESSENTRY32);
bRetval = Process32First(hSnapShot, &proEntry32) true : false;
while (bRetval)
{
if (0 == StrCmpI(proEntry32szExeFile, csProName))
{
bFind = true;
break;
}
bRetval = Process32Next(hSnapShot, &proEntry32) true : false;
proEntry32dwSize = sizeof(PROCESSENTRY32);
}
if (!bFind)
{
AddOutPut(_T("!!由进程名字得到进程ID失败,未找到该进程!"));
return 0;
}
if (hSnapShot != NULL)
{
CloseHandle(hSnapShot);
}
AddOutPut(_T("->由进程名字得到进程ID成功"));
return proEntry32th32ProcessID;
}
以上就是关于MFC程序运行的时候是单线程还是多线程的呢全部的内容,包括:MFC程序运行的时候是单线程还是多线程的呢、mfc 获取系统进程的过程、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)