2008-09-09 24 views
6

¿Cómo creo un proceso en segundo plano con Haskell en Windows sin que se haya creado una ventana de comando visible?Crear proceso en segundo plano en ventanas sin ventana de consola visible

Escribí un programa Haskell que ejecuta procesos de copia de seguridad periódicamente, pero cada vez que lo ejecuto, se abre una ventana de comandos en la parte superior de todas las ventanas. Me gustaría deshacerme de esta ventana. ¿Cuál es la forma más simple de hacer esto?

+1

Esta pregunta debe volver a abrirse, ya que se trata de un "problema de programación específico", específicamente cómo iniciar un proceso en segundo plano de Haskell. – Cirdec

+0

Editado/redactado de nuevo con la esperanza de volver a abrirlo. Creo que esta es una pregunta útil. Yo también creo que debería volver a abrirse – Andre

Respuesta

0

La manera más simple que puedo pensar es ejecutar el comando rsync desde un script de Windows Shell (vbs o cmd).

0

No sé nada de Haskell, pero tuve este problema en un proyecto de C hace unos meses.

La mejor forma de ejecutar un programa externo sin que aparezcan ventanas es utilizar la función ShellExecuteEx() API con el verbo "abrir". Si ShellExecuteEx() está disponible para usted en Haskell, entonces debería poder lograr lo que desea.

El código C se ve algo como esto:

SHELLEXECUTEINFO Info; 
BOOL b; 

// Execute it 
memset (&Info, 0, sizeof (Info)); 
Info.cbSize = sizeof (Info); 
Info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI; 
Info.hwnd = NULL; 
Info.lpVerb = "open"; 
Info.lpFile = "rsync.exe"; 
Info.lpParameters = "whatever parameters you like"; 
Info.lpDirectory = NULL; 
Info.nShow = SW_HIDE; 
b = ShellExecuteEx (&Info); 
if (b) 
    { 
    // Looks good; if there is an instance, wait for it 
    if (Info.hProcess) 
     { 
     // Wait 
     WaitForSingleObject (Info.hProcess, INFINITE); 
     } 
    } 
+0

No creo que sea directamente, pero solo queda un poco de FFI. – wnoise

5

Usted realmente debe decirnos cómo se está tratando de hacer esto en la actualidad, pero en mi sistema (usando Linux) el siguiente fragmento se ejecutará un comando sin necesidad de abrir una nueva ventana de terminal. Debería funcionar de la misma manera en Windows.

module Main where 
import System 
import System.Process 
import Control.Monad 

main :: IO() 
main = do 
    putStrLn "Running command..." 
    pid <- runCommand "mplayer song.mp3" -- or whatever you want 
    replicateM_ 10 $ putStrLn "Doing other stuff" 
    waitForProcess pid >>= exitWith 
+1

Los scripts que funcionan directamente en la línea de comandos en Linux tienden a aparecer en la ventana de cmd en Windows. Acabo de experimentar este placer por primera vez ayer. –

4

Gracias por las respuestas hasta ahora, pero he encontrado mi propia solución. Intenté muchas cosas diferentes, desde escribir un script vbs como se sugirió a un programa independiente llamado hstart. hstart funcionó ... pero crea un proceso separado que no me gustó mucho porque entonces no puedo matarlo de la manera normal. Pero encontré una solución más simple que requería simplemente el código Haskell.

Mi código de antes era una simple llamada a runCommand, que apareció en la ventana. Una función alternativa que puede usar es runProcess que tiene más opciones. Al leer detenidamente el archivo de código fuente de ghc runProcess.c, encontré que el indicador CREATE_NO_WINDOW se establece cuando se proporcionan redirecciones para STDIN, STOUT y STDERR. Entonces eso es lo que debes hacer, proporcionar redirecciones para esos. Mi programa de prueba se ve así:

import System.Process 
import System.IO 
main = do 
    inH <- openFile "in" ReadMode 
    outH <- openFile "out" WriteMode 
    runProcess "rsync.bat" [] Nothing Nothing (Just inH) (Just outH) (Just outH) 

Esto funcionó! Sin ventana de comando otra vez! Una advertencia es que necesita un archivo vacío para que InH lo lea como STDIN aunque en mi situación no era necesario.

+0

Parece que su código no está completo. ¿Qué es "do inH"? – oshyshko

+0

Quizás haya mejores identificadores para suministrar que los archivos '" in "' y '" out "' del directorio actual? – Cirdec

Cuestiones relacionadas