美文网首页
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启动线程的内存问题

    QProcess启动线程的内存问题 在使用QProcess的过程中,采用了 启动与项目相关的exe文件,然后在采用...

  • jvm配置简洁说明

    -Xms启动内存-Xmx最大内存-Xmn年轻内存-Xss线程堆栈-XX:NewRatio=年轻/年老-XX:Sur...

  • Qt 之启动putty,winscp

    简述 QProcess可以用来启动外部程序,并与它们交互。 要启动一个进程,通过调用start()来进行,参数包含...

  • android 开发之性能优化方向

    一、内存优化 1、内存泄露 资源没有及时释放,线程启动后要销毁,service启动后使用完毕要取消注册,Broad...

  • 内存优化

    内存优化、UI优化(布局优化、会只优化)、速度优化(线程优化、网络优化)、启动优化、电量优化 内存优化 内存抖动:...

  • jvm的一些笔记

    jvm内存模型 一. 线程私有区域 线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束而创建/销毁(在...

  • JVM学习3·实例代码运行JVM内存处理全流程

    1.代码执行后的内存空间分配 根据代码,首先jvm启动时候就会先生成方法区与堆内存,然后方法启动之前会先启动线程,...

  • Java并发(6)——Java内存模型

    并发编程两个问题 多线程之前有两个问题需要解决:线程之间的通信和线程同步。线程通信:共享内存和消息传递。共享内存方...

  • Tomcat优化

    Tomcat优化,可以分为内存,线程,IO. 1、Tomcat内存优化,启动时告诉JVM我要一块大内存(调优内存是...

  • 9.2019java内存模型相关

    java内存模型 堆内存是被所有线程共享的运行时内存区域,存在可见性的问题。线程之间共享变量存储在主存中,每个线程...

网友评论

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

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