none
Cómo establecer la prioridad de programa lanzado desde un WindowsForm RRS feed

  • Pregunta

  • Hola, tengo una aplicación WindowsForm que lanza un hilo del tipo (Threading.Timer) y este hilo hace una serie de comprobaciones y llama a un ARCHIVO.BAT que abre dos programas externos que funcionan por línea de comandos (son conversores de video).

    Un esquema:

    APLICACION WINDOWS FORM -> HILO -> ARCHIVO.BAT -> EJECUTA DOS .EXE

    El caso es que los programas externos se comen bastante CPU y el servidor se satura.

    ¿Hay forma de limitar el uso de la CPU para esos programas externos?

    Mi programa WindowsForm he establecido en el load la propiedad: Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.Idle

    Pero los programas externos que se lanzan no sé como puedo establecerles la prioridad.

    Además sé que los hilos (thread) tienen prioridad pero en el caso de los Threading.Timer no existe esa propiedad? Y si existe afectaría a los programas externos que lanzo?

    Alguna idea o ayuda de cómo puedo liminar el uso de la CPU por un programa que lanzo desde mi aplicación.

    Gracias por la ayuda.


    • Editado _PSK_ miércoles, 21 de noviembre de 2012 17:48
    miércoles, 21 de noviembre de 2012 17:46

Respuestas

  • Si arrancas el programa externo mediante Process.Start, dicha llamada te devuelve un objeto del tipo Process. Y este proceso tiene una prioridad llamada PriorityClass que te permite cambiarle la prioridad nada más iniciarlo:

    Dim prc As Process = New Process()
    prc.StartInfo.FileName = "proceso.exe"
    prc.StartInfo.Arguments = argumentos
    prc.PriorityClass = ProcessPriorityClass.BelowNormal
    prc.Start()

    • Marcado como respuesta _PSK_ jueves, 22 de noviembre de 2012 18:17
    miércoles, 21 de noviembre de 2012 20:07
  • _PSK_, pruébelo primero porque me parece que la respuesta de Alberto es correcta.  Los procesos hijo heredan muchas propiedades de sus proceso padre.  Por ejemplo, la identidad que usa un proceso suele ser la identidad del padre.  Igualmente la prioridad es heredada según recuerdo.  Puede verificar la prioridad del proceso hijo del BAT usando el administrador de tareas.

    Jose R. MCP
    Code Samples

    • Marcado como respuesta _PSK_ jueves, 22 de noviembre de 2012 18:17
    jueves, 22 de noviembre de 2012 14:22
    Moderador

Todas las respuestas

  • Si arrancas el programa externo mediante Process.Start, dicha llamada te devuelve un objeto del tipo Process. Y este proceso tiene una prioridad llamada PriorityClass que te permite cambiarle la prioridad nada más iniciarlo:

    Dim prc As Process = New Process()
    prc.StartInfo.FileName = "proceso.exe"
    prc.StartInfo.Arguments = argumentos
    prc.PriorityClass = ProcessPriorityClass.BelowNormal
    prc.Start()

    • Marcado como respuesta _PSK_ jueves, 22 de noviembre de 2012 18:17
    miércoles, 21 de noviembre de 2012 20:07
  • Gracias por tu respuesta Alberto, si uso el Process.Start pero lo utilizo para llamar a un .BAT y este a su vez es el que llama a los otros dos programas .exe que son los que me interesaría controlar su prioridad.

    No creo que cambiando la prioridad del BAT influya en los programas que ejecuta el .BAT.

    jueves, 22 de noviembre de 2012 8:14
  • _PSK_, pruébelo primero porque me parece que la respuesta de Alberto es correcta.  Los procesos hijo heredan muchas propiedades de sus proceso padre.  Por ejemplo, la identidad que usa un proceso suele ser la identidad del padre.  Igualmente la prioridad es heredada según recuerdo.  Puede verificar la prioridad del proceso hijo del BAT usando el administrador de tareas.

    Jose R. MCP
    Code Samples

    • Marcado como respuesta _PSK_ jueves, 22 de noviembre de 2012 18:17
    jueves, 22 de noviembre de 2012 14:22
    Moderador
  • Hola WebJose lo he probado y no tiene efecto. He establecido la prioridad del proceso que lanza el .BAT en ProcessPriorityClass.Idle (la más baja) y el ffmpeg.exe (conversor de video) muestra porcentajes de hasta el 89%.
    jueves, 22 de noviembre de 2012 16:56
  • El porcentaje es irrelevante.  Haga clic derecho sobre ffmpeg.exe en el administrador de tareas, luego busque en el menú emergente las opciones de prioridad para el proceso.  La prioridad seleccionada debería ser la misma que se usó para el BAT.

    Además le recuerdo que el procesador está ahí para usarse.  Una PC con un porcentaje bajo de procesamiento es una PC que está desperdiciando potencial de cómputo.  No hay nada malo en que una PC pase con su procesador al 100% por horas, días o semanas.  Para eso es:  Para procesar.


    Jose R. MCP
    Code Samples

    jueves, 22 de noviembre de 2012 16:59
    Moderador
  • En mi caso el porcentaje no es irrelevante porque la aplicación corre en un servidor que tiene varias aplicaciones corriendo y páginas web con lo cual si el programa se come toda la CPU los otros programas van más lentos y el servidor no se puede manejar.

    Por eso necesito que para los .exe que lanzo limitar el uso de la CPU ya que influye en otros programas y su rendimiento.

    PD: tienes razón que los ejecutables que lanzo desde el .BAT han heredado su prioridad está en baja.
    • Editado _PSK_ jueves, 22 de noviembre de 2012 17:24
    jueves, 22 de noviembre de 2012 17:17
  • Ok, si está en Baja y aún así el sistema operativo asigna 89% del poder de procesamiento es porque considera prudente hacerlo.  No podemos meternos con esas decisiones de sistema operativo.  Si el servidor de ahoga con esta tarea más otras tareas, simplemente necesitará comisionar otro servidor para repartir las labores.

    Claro, antes de tomar la decisión de invertir en otro servidor le aconsejo que contrate un experto certificado en Windows Server para que analice la situación a fondo y le dé una recomendación profesional y bien fundamentada.


    Jose R. MCP
    Code Samples

    jueves, 22 de noviembre de 2012 17:35
    Moderador
  • Gracias por la ayuda de momento mantendré el servidor porque he comprobado que si hay otro proceso consumiendo CPU reduce su porcentaje.
    jueves, 22 de noviembre de 2012 18:16
  • Ahora con los procesadores de varios nucleos tienes la opcion de asignarle 2 nucleos de 8, o 4 nucleos de 8, asi le pones tope a uso total de la cpu.

    Yo lo uso para lanzar el 7zip via consola, y sino le limito los nucleos, coge el 99% de un servidor.

    un saludo

    viernes, 22 de enero de 2021 8:31