有时候自己写的程序,虽然对话框关闭了,但是对话框的一些成员变量并没有释放掉(这些成员变量往往是一些指针,在对话框的构造函数里构造,在对话框的析构函数里释放)如果阴差阳错没释放掉,就造成进程不能退出。
解决这个问题 的办法,既要“预防”,也要“治标”。所谓预防,就是在对话框的声明文件里,尽量把成员用变量声明,不要用指针。如:
class MyDlg : public QDialog
{
MyDialog();
~MyDialog();
public:
QWidget m_wdt;//直接用变量,正确的申请方式
QWidget * m_pWdt;//用指针,不推荐的申请方式
}
但是预防不能奏效时,只能用简单粗暴的办法“治标”。下面给一个例子,每次名为mainwin.exe的程序启动之前,把同名程序的进程全杀死。当然,更好的办法是每次在程序退出时,“杀死自己”。
#include "mainwindow.h"
#include <QApplication>
#include <QDir>
int iGetProcessID(char * pResult)
{
//认为每行是一个记录.记录第一列是程序名,占30个字符,随后是4个字符构成的进程ID
QString qstrLine = QString(QLatin1String(pResult));
QString qstrVal = qstrLine.mid(30, 4);
bool bSuccess;
return qstrVal.toInt(&bSuccess);
}
int iGetCmdResult(char * pCmd, int * pResult, int iLen)
{
//进程被视为一个文件,也用open打开,用close关闭
FILE * fp = _popen(pCmd, "r");
int k = 0;
if(fp != NULL)
{
char arrTmp[1024] = {0};
while(fgets(arrTmp, iLen, fp) != NULL)
{
pResult[k++] = iGetProcessID(arrTmp);
memset(arrTmp, 0, sizeof(arrTmp));
}
_pclose(fp);
}
return k;
}
int main(int argc, char *argv[])
{
//删除上一次的残留进程
int arrResult[100] = {0};
int iID = GetCurrentProcessId();//当前线程ID,不能删
int iQuantity = iGetCmdResult("tasklist | findstr MainWin.exe", arrResult, 1024);
for(int k = 0; k < iQuantity; k++)
{
if(iID != arrResult[k])
{
char cstrCmd[100] = {0};
sprintf(cstrCmd, "taskkill /pid %d /F", arrResult[k]);
WinExec(cstrCmd, SW_HIDE);
}
}
....................
}