QT 进程基础(一) QT如何判断另外一个进程在运行

Qt库似乎没有完整的跨平台解决方案,你可能需要自己分平台判断。

windows可以使用上述提到的方法使用openprocess获取相关信息。终止很简单:

ShellExecute(0, "open","TASKKILL",(processname,NULL, SW_HIDE);

其他平台需要想办法找到进程的pid(例如调用系统的ps命令进行过滤查找),

linux打开/proc/pid/cmdline查看进程状态。

sun系统打开/proc/pid/psinfo查看进程状态。

---------------------------WIN平台------------------------------------------------

附代码:

const   char   DESTPROC[19]   =   "cmd.exe";    
DWORD   pid   =   ProcessToPID(DESTPROC);    
返回为0就是没有

  1. DWORD ProcessToPID(const char *InputProcessName)
  2. {
  3. DWORD aProcesses[1024], cbNeeded, cProcesses;
  4. unsigned int i;
  5. HANDLE hProcess = NULL;
  6. HMODULE hMod = NULL;
  7. char szProcessName[MAX_PATH] = "UnknownProcess";
  8. AddPrivilege(SE_DEBUG_NAME);
  9. // 计算目前有多少进程, aProcesses[]用来存放有效的进程PIDs
  10. if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
  11. {
  12. return 0;
  13. }
  14. cProcesses = cbNeeded / sizeof(DWORD);
  15. // 按有效的PID遍历所有的进程
  16. for ( i = 0; i < cProcesses; i++ )
  17. {
  18. // 打开特定PID的进程
  19. hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
  20. PROCESS_VM_READ,
  21. FALSE, aProcesses[i]);
  22. // 取得特定PID的进程名
  23. if ( hProcess )
  24. {
  25. if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
  26. {
  27. GetModuleBaseName( hProcess, hMod,
  28. szProcessName, sizeof(szProcessName) );
  29. //将取得的进程名与输入的进程名比较,如相同则返回进程PID
  30. if(!stricmp(szProcessName, InputProcessName))
  31. {
  32. CloseHandle( hProcess );
  33. return aProcesses[i];
  34. }
  35. }
  36. }//end of if ( hProcess )
  37. }//end of for
  38. //没有找到相应的进程名,返回0
  39. CloseHandle( hProcess );
  40. return 0;
  41. }

也可以枚举得到所有进程的应用程序名,然后和知道应用程序名比较判断。

  1. DWORD GetProcessidFromName(LPCTSTR name)
  2. {
  3. PROCESSENTRY32 pe;
  4. DWORD id=0;
  5. HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  6. pe.dwSize=sizeof(PROCESSENTRY32);
  7. if(!Process32First(hSnapshot,&pe))
  8. return 0;
  9. while(1)
  10. {
  11. pe.dwSize=sizeof(PROCESSENTRY32);
  12. if(Process32Next(hSnapshot,&pe)==FALSE)
  13. break;
  14. if(strcmp(pe.szExeFile,name)==0)
  15. {
  16. id=pe.th32ProcessID;
  17. break;
  18. }
  19. }
  20. CloseHandle(hSnapshot);
  21. return id;
  22. }
时间: 2024-11-10 07:27:24

QT 进程基础(一) QT如何判断另外一个进程在运行的相关文章

QT ui基础(一) QT dialog 及UI 关系

2016-09-17 19:41:20|  分类: QT QT ui基础(一)  QT dialog 及UI 关系 #ifndef MYWIDGET_H#define MYWIDGET_H #include <QWidget>//#include "mydialog.h"namespace Ui {    class MyWidget;}class MyDialog;class MyWidget : public QWidget{    Q_OBJECT public:  

Linux进程核心调度器之主调度器--Linux进程的管理与调度(十九)

日期 内核版本 架构 作者 GitHub CSDN 2016-06-30 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 我们前面提到linux有两种方法激活调度器:核心调度器和 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测是否有必要 因而内核提供了两个调度器主调度器,周期性调度器,分别实现如上工作, 两者合在一起就组成了核心调度器(core sched

Linux进程核心调度器之主调度器schedule--Linux进程的管理与调度(十九)【转】

转自:http://blog.csdn.net/gatieme/article/details/51872594 日期 内核版本 架构 作者 GitHub CSDN 2016-06-30 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 我们前面提到linux有两种方法激活调度器:核心调度器和 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测是否有必要 因而内

在GNU Linux中怎样得到一个进程当前的流量

/*********************************************************************  * Author  : Samson  * Date    : 11/19/2014  * Test platform:  *              3.13.0-24-generic  *              GNU bash, 4.3.11(1)-release  * ************************************

Qt 线程基础

(转自:http://my.oschina.net/laopiao/blog/88158) 保谓线程? 线程与并行处理任务息息相关,就像进程一样.那么,线程与进程有什么区别呢?当你在电子表格上进行数据结算的时候,在相同的桌面上可能有一个播放器正在播放你最喜欢的歌曲.这是一个两个进程并行工作的例子:一个进程运行电子表格程序;另一个进程运行一个媒体播放器.这种情况最适合用多任务这个词来描述.进一步观察媒体播放器,你会发现在这个进程内,又存在并行的工作.当媒体播放器向音频驱动发送音乐数据的时候,用户界

Qt 线程基础(QThread、QtConcurrent等) 2

使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快. 为保持GUI线程或其他高实时性线程的响应,将耗时的操作或阻塞的调用移到其他线程. 何时使用其他技术替代线程 开发人员使用线程时需要非常小心.启动线程是很容易的,但确保所有共享数据保持一致很难.遇到问题往往很难解决,这是由于在一段时间内它可能只出现一次或只在特定的硬件配置下出现.在创建线程来解决某些问题之前,应该考虑一些替代的技术 : 替代技术 注解 QEventLoop::processEvents() 在一个耗时的计

QT-【转】Qt 4迁移至Qt 5

将Qt 4代码迁移到Qt 5还是比较简单的.实际上,在Qt 5开发过程中就已经注意了与Qt 4代码保持兼容性. 与Qt 3到Qt 4的迁移不同,Qt 5的核心类库并没有做大的API的修改,只有几个新的类取代了旧的(例如,像Qt 4的QList取代了QPtrList和QValueList:itemview取代了Q3ListView:graphicsview取代了Canvas API):同时也没有那些编译通过了,但运行时的行为却与之前的不一致的(例如,QWidget::show现在是非虚函数,绘制应

Qt编程16:Qt向导简单使用(QWizard及QWizardPage)

关于Qt向导的使用,在Qt4.8.1以及4Q5.2.1中存在一个简单的例子,实现方式与我的方式有所不同. 在原有的例子中,使用了三个方法,分别定义了三个向导页:然后在main函数中将三个向导页通过addPage的方法加入向导. 如此比较简单实现,但是我觉得不够灵活.最后是将三个向导页分别继承QWizardPage,因为会涉及到每个向导页的一些操作.在这里也是基础. mywizard.h #ifndef MYWIZARD_H #define MYWIZARD_H #include <QWizard

Qt官方教程翻译——Qt QML

Pull 解析器简介 Pull 解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如: 开始元素和结束元素事件,使用xmlPullParser.next() 可以进入下一个元素并触发相应事件.跟 SAX 不同的 是, Pull 解析器产生的事件是一个数字,而非方法,因此可以使用一个 switch 对事件进行处理.当元素开始解析时,调用 parser.nextText() 方法可以获取下一个 Text 类型节点的值. Pull解析器的源码及文档下载网址:http://www.xmlpul