2008-09-09 13 views
6

表示されたコマンドウィンドウを作成せずに、Haskellでバックグラウンドプロセスを作成する方法を教えてください。コンソールウィンドウが表示されていないウィンドウでバックグラウンドプロセスを作成する

私は定期的にバックアッププロセスを実行するHaskellプログラムを作成しましたが、毎回実行するたびにすべてのウィンドウの上部にコマンドウィンドウが開きます。私はこの窓を取り除きたい。これを行う最も簡単な方法は何ですか?

+1

この質問は、「特定のプログラミング問題」、具体的にはHaskellのバックグラウンドでプロセスを開始する方法について再開する必要があります。 – Cirdec

+0

再オープンを希望して編集/改訂しました。私はこれが役に立つ質問だと思う。私はあまりにもそれを再オープンする必要があると思う – Andre

答えて

0

私が考えることができる最も簡単な方法は、Windowsシェルスクリプト(vbsまたはcmd)からrsyncコマンドを実行することです。

0

私はハスケルについて何も知らないが、私は数ヶ月前にCプロジェクトでこの問題を抱えていた。

ウィンドウがポップアップせずに外部プログラムを実行する最も良い方法は、ShellExecuteEx()API関数を "open"動詞と共に使用することです。 HaskellでShellExecuteEx()を利用できる場合は、必要なものを達成できるはずです。

Cコードは次のようになります。

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

私はそれが直接ではないと信じていませんが、それは離れてFFIの小さなビットです。 – wnoise

5

あなたは本当に次のスニペットは、開口部なしでコマンドを実行しますあなたは現在、これをやろうとしているが、私のシステム上で(Linuxを使用)する方法を教えなければなりません新しい端末ウィンドウ。それは窓で同じように動作するはずです。

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

Linuxのコマンドラインでまっすぐ動作するスクリプトは、Windowsのcmdウィンドウをポップアップする傾向があります。私は昨日初めてこの快楽を経験しました。 –

4

これまでの回答に感謝しますが、自分で解決策を見つけました。私は、hstartと呼ばれるスタンドアロンのプログラムに提案されているvbsスクリプトを書くことから、さまざまなことを試しました。 hstartは働いていましたが、私はそれほど好きではない別のプロセスを作りました。通常の方法でそれを殺すことができないからです。しかし、単純にハスケルコードを必要とする単純な解決策が見つかりました。

前のコードは、ウィンドウをポップアップしたrunCommandの簡単な呼び出しでした。使用できる代替機能はrunProcessで、これにはさらに多くのオプションがあります。 ghcのソースコードファイルrunProcess.cを見てから、STDIN、STOUT、およびSTDERRのすべてにリダイレクトを指定すると、CREATE_NO_WINDOWフラグが設定されていることがわかりました。そういうわけで、あなたがしなければならないことは、それらのリダイレクトを提供することです。私のテストプログラムは次のようになります:

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) 

これは機能しました!もう一度コマンドウィンドウはありません!注意しなければならないことは、私の状況でSTDINイベントとして読み込むためにinHのために空のファイルが必要であるということです。

+0

コードが完全ではないようです。 「do inH」とは何ですか? – oshyshko

+0

おそらく、現在のディレクトリから '' ''と '' out "'のファイルよりも補完する方が良いでしょうか? – Cirdec

関連する問題