MFC软件开发中如何实现延时重启?

wjqzzzy 2017-10-27 11:49:48
本人在开发软件时需要用到软件重启,但是软件退出时有些清理工作比较慢,重启时需要等待内存清理完成时再重启?如何实现,谢谢!

目前是软件退出时调用CreateProcess再重新打开软件,但是现实是有时打开软件时前面软件还没有清理完成!

char pBuf[MAX_PATH];
//获取应用程序完全路径,比 GetCurrentDirectory 好用多了
GetModuleFileName(NULL,pBuf,MAX_PATH);

STARTUPINFO startupinfo;
PROCESS_INFORMATION proc_info;
memset(&startupinfo,0,sizeof(STARTUPINFO));
startupinfo.cb=sizeof(STARTUPINFO);
// 最重要的地方
if(TRUE) ::CreateProcess(pBuf,NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&startupinfo,&proc_info);
...全文
909 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
www_boyunyun_com 2018-03-01
  • 打赏
  • 举报
回复
清理之前启动另一个程序启动这个程序,然后把正在清理的程序窗口隐藏不就OK了
tlbbsff 2017-12-21
  • 打赏
  • 举报
回复
sleep就完事
sichuanwww 2017-12-15
  • 打赏
  • 举报
回复
内核对象的基本功能。
worldy 2017-12-14
  • 打赏
  • 举报
回复
CreateProcess创建一个重启进程,但是,你必须使用一个进程共享的同步对象来控制是否关闭完成,同步对象在程序进入时马上创建,在程序的最后,再关闭。
zgl7903 2017-12-14
  • 打赏
  • 举报
回复
用另外一个程序 做判断和启动

// ExeRestart.cpp 
//

#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <tchar.h>
#include <shellapi.h>
#include <tlhelp32.h>
#include <Shlwapi.h>
#pragma comment(lib, "Shlwapi.lib")

BOOL FoundProcess (DWORD dwProcessID) 
{ 
  BOOL           bRet      = FALSE; 
  HANDLE         hProcessSnap = NULL; 
  
  hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);   
  if (hProcessSnap != INVALID_HANDLE_VALUE)
  {
    PROCESSENTRY32 pe32 = {sizeof(PROCESSENTRY32)}; 
    BOOL bWorking = Process32First(hProcessSnap, &pe32);

    while(bWorking)
    { 
      if(dwProcessID == pe32.th32ProcessID)
      {
        bRet = TRUE; 
      }
      
      bWorking = Process32Next(hProcessSnap, &pe32); 
    }
    
    CloseHandle (hProcessSnap); 
  }

  return (bRet); 
}  

//
//ExeRestart /PID=等待结束的PID /EXE=启动的EXE程序

int _tmain(int argc, TCHAR* argv[])
{
  int iRet = 0;
  LPCTSTR szApp = PathFindFileName(argv[0]);
  LPCTSTR szPID = NULL, szExe = NULL;

  if(argc != 3)
  {
    _tprintf(_T("Using %s /PID=1234 /EXE=aa.exe\n"), szApp);
  }
  else
  {
    szPID = argv[1]+5;
    szExe = argv[2]+5;
    
    DWORD dwPID= _tcstoul(szPID, NULL, 10);
    
    if(dwPID != GetCurrentProcessId())
    {
      while(FoundProcess(dwPID))
      {
        Sleep(1000);
      }
      
      iRet = (int)ShellExecute(NULL, NULL, szExe, NULL, NULL, SW_SHOWNORMAL);
    }
  }

	return iRet;
}

Eleven 2017-12-14
  • 打赏
  • 举报
回复
用内核对象互斥量CreateMutex即可
qq_36252226 2017-12-13
  • 打赏
  • 举报
回复
这个是不是只把窗口关掉就行了,清理的工作在程序里,清理完了再打开窗口
smwhotjay 2017-10-28
  • 打赏
  • 举报
回复
软件退出前 调用 创建个全局命名事件或者互斥,达到提示。 清理结束,在最后退出时关闭命名事件/互斥 另一个启动进程开启时检测这个信号事件/互斥 存在则等待前一个软件退出。
向立天 2017-10-28
  • 打赏
  • 举报
回复
你可以等所有清理工作都完成再调用CreateProcess呀 否则就要单独写一个服务监控当前程序等状态等到完全退出再把他重启

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧