表示されたコマンドウィンドウを作成せずに、Haskellでバックグラウンドプロセスを作成する方法を教えてください。コンソールウィンドウが表示されていないウィンドウでバックグラウンドプロセスを作成する
私は定期的にバックアッププロセスを実行するHaskellプログラムを作成しましたが、毎回実行するたびにすべてのウィンドウの上部にコマンドウィンドウが開きます。私はこの窓を取り除きたい。これを行う最も簡単な方法は何ですか?
表示されたコマンドウィンドウを作成せずに、Haskellでバックグラウンドプロセスを作成する方法を教えてください。コンソールウィンドウが表示されていないウィンドウでバックグラウンドプロセスを作成する
私は定期的にバックアッププロセスを実行するHaskellプログラムを作成しましたが、毎回実行するたびにすべてのウィンドウの上部にコマンドウィンドウが開きます。私はこの窓を取り除きたい。これを行う最も簡単な方法は何ですか?
私が考えることができる最も簡単な方法は、Windowsシェルスクリプト(vbsまたはcmd)からrsyncコマンドを実行することです。
私はハスケルについて何も知らないが、私は数ヶ月前に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);
}
}
私はそれが直接ではないと信じていませんが、それは離れてFFIの小さなビットです。 – wnoise
あなたは本当に次のスニペットは、開口部なしでコマンドを実行しますあなたは現在、これをやろうとしているが、私のシステム上で(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
Linuxのコマンドラインでまっすぐ動作するスクリプトは、Windowsのcmdウィンドウをポップアップする傾向があります。私は昨日初めてこの快楽を経験しました。 –
これまでの回答に感謝しますが、自分で解決策を見つけました。私は、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のために空のファイルが必要であるということです。
この質問は、「特定のプログラミング問題」、具体的にはHaskellのバックグラウンドでプロセスを開始する方法について再開する必要があります。 – Cirdec
再オープンを希望して編集/改訂しました。私はこれが役に立つ質問だと思う。私はあまりにもそれを再オープンする必要があると思う – Andre