美文网首页
QProcess启动线程的内存问题

QProcess启动线程的内存问题

作者: 然而到了平面上 | 来源:发表于2019-05-17 17:11 被阅读0次

    QProcess启动线程的内存问题

    在使用QProcess的过程中,采用了

    start(const  QString  &program,  const  QStringList  &arguments,  OpenMode  mode  =  ReadWrite)
    

    启动与项目相关的exe文件,然后在采用QIODevice 中 write(const char *data)进行写入,本来发现挺好的,但是突然出现了一个bug,在进行打开QProcess后,居然视频的流没有办法正常的关闭,于是猜测有QProcess启动另一个子线程采用了同一个空间。而采用

    static  bool  startDetached(const  QString  &program,  const  QStringList  &arguments);
    

    构建了两个没有子父关系的进程时,QProcess中的各种函数都不起作用,例如判断是否当前状态的函数state()或者写入进程函数write(char*data)

    查看QT的源代码后,在qprocess_win.cpp 找到了源代码startProcess ()函数中

    struct  CreateProcessArguments
      {
      const  wchar_t  *applicationName;
      wchar_t  *arguments;
      Q_SECURITY_ATTRIBUTES  *processAttributes;
      Q_SECURITY_ATTRIBUTES  *threadAttributes;
      bool  inheritHandles;
      unsigned  long  flags;
      void  *environment;
      const  wchar_t  *currentDirectory;
      Q_STARTUPINFO  *startupInfo;
      Q_PID  processInformation;
      };
    
        QProcess::CreateProcessArguments cpargs = {
            0, (wchar_t*)args.utf16(),
            0, 0, TRUE, dwCreationFlags,
            environment.isEmpty() ? 0 : envlist.data(),
            nativeWorkingDirectory.isEmpty() ? Q_NULLPTR : (wchar_t*)nativeWorkingDirectory.utf16(),
            &startupInfo, pid
        };
        if (modifyCreateProcessArgs)
            modifyCreateProcessArgs(&cpargs);
        success = CreateProcess(cpargs.applicationName, cpargs.arguments, cpargs.processAttributes,
                                cpargs.threadAttributes, cpargs.inheritHandles, cpargs.flags,
                                cpargs.environment, cpargs.currentDirectory, cpargs.startupInfo,
                                cpargs.processInformation);
    

    而windows CreateProcess的参数命令

    值:CREATE_SEPARATE_WOW_VDM

    如果被设置,新进程将会在一个私有的虚拟DOS机(VDM)中运行。另外,默认情况下所有的16位Windows应用程序都会在同一个共享的VDM中以线程的方式运行。单独运行一个16位程序的优点是一个应用程序的崩溃只会结束这一个VDM的运行;其他那些在不同VDM中运行的程序会继续正常的运行。同样的,在不同VDM中运行的16位Windows应用程序拥有不同的输入队列,这意味着如果一个程序暂时失去响应,在独立的VDM中的应用程序能够继续获得输入。所以可以看到为0,所以以线程的方式运行,公用同一段空间。

    解决方式

    既然,不行,然后采用startDetached的方式启动,然后使用socket的方式两者进行通信。而对于qt而言,在文档中On Windows this is a named pipe and on Unix this is a local domain socket.表明采用了管道的方式,所以不会造成资源的浪费。而QLocalSocket采用的是全双工的模式,可以相互之间通信~~

    相关文章

      网友评论

          本文标题:QProcess启动线程的内存问题

          本文链接:https://www.haomeiwen.com/subject/xlwoaqtx.html