2008-09-09 17 views
6

मैं दृश्यमान विंडो विंडो के बिना विंडोज़ पर हास्केल के साथ पृष्ठभूमि प्रक्रिया कैसे बना सकता हूं?बिना दृश्य कंसोल विंडो के विंडोज़ में पृष्ठभूमि प्रक्रिया बनाएं

मैंने एक हास्केल प्रोग्राम लिखा जो समय-समय पर बैकअप प्रक्रिया चलाता है लेकिन हर बार जब मैं इसे चलाता हूं, तो सभी विंडो के शीर्ष पर एक कमांड विंडो खुलती है। मैं इस खिड़की से छुटकारा पाना चाहता हूं। ऐसा करने का सबसे आसान तरीका क्या है?

+1

यह प्रश्न फिर से खोलना चाहिए, क्योंकि यह एक "विशिष्ट प्रोग्रामिंग समस्या" के बारे में है, विशेष रूप से हास्केल से पृष्ठभूमि में प्रक्रिया कैसे शुरू करें। – Cirdec

+0

पुन: खोलने की उम्मीद में संपादित/संशोधित। मुझे लगता है कि यह एक उपयोगी सवाल है। मुझे भी लगता है कि इसे – Andre

उत्तर

0

विंडोज शैल स्क्रिप्ट (vbs या cmd) के भीतर से rsync कमांड चलाने के लिए सबसे आसान तरीका है।

0

मुझे हास्केल के बारे में कुछ भी पता नहीं है, लेकिन कुछ महीने पहले मुझे सी परियोजना में यह समस्या थी।

किसी भी विंडोज पॉपिंग के बिना बाहरी प्रोग्राम निष्पादित करने का सबसे अच्छा तरीका है "ओपन" क्रिया के साथ ShellExecuteEx() API फ़ंक्शन का उपयोग करना। यदि Haskell में ShellExecuteEx() आपके लिए उपलब्ध है, तो आप जो चाहते हैं उसे प्राप्त करने में सक्षम होना चाहिए।

सी कोड इस तरह दिखता है:

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

दोबारा खोला जाना चाहिए, मुझे विश्वास नहीं है कि यह सीधे है, लेकिन यह केवल एफएफआई का एक छोटा सा हिस्सा है। – 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

स्क्रिप्ट जो लिनक्स में कमांड लाइन पर सीधे काम करती हैं, वे विंडोज़ में सीएमडी विंडो पॉप अप करते हैं। मैंने कल पहली बार इस खुशी का अनुभव किया। –

4

अब तक प्रतिक्रियाओं के लिए धन्यवाद, लेकिन मुझे अपना स्वयं का समाधान मिला है। मैंने कई अलग-अलग चीजों की कोशिश की, एक vbs स्क्रिप्ट लिखने से, जिसे हस्टार्ट नामक एक स्टैंडअलोन प्रोग्राम के लिए सुझाव दिया गया था। hstart काम किया ... लेकिन यह एक अलग प्रक्रिया बनाता है जो मुझे बहुत पसंद नहीं आया क्योंकि तब मैं इसे सामान्य तरीके से मार नहीं सकता। लेकिन मुझे एक आसान समाधान मिला जिसमें केवल हास्केल कोड की आवश्यकता थी।

पहले से मेरा कोड रन करने के लिए एक साधारण कॉल था कॉमांड, जिसने खिड़की पॉप अप किया था। एक वैकल्पिक फ़ंक्शन जिसका आप उपयोग कर सकते हैं runProcess है जिसमें अधिक विकल्प हैं। Ghc स्रोत कोड फ़ाइल runProcess.c पर देखकर, मैंने पाया कि CREATE_NO_WINDOW ध्वज सेट किया गया है जब आप सभी STDIN, STOUT, और STDERR के लिए रीडायरेक्ट की आपूर्ति करते हैं। तो यही है कि आपको क्या करना है, उन लोगों के लिए रीडायरेक्ट की आपूर्ति करें। मेरा परीक्षण कार्यक्रम इस तरह दिखता है:

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) 

यह काम किया! कोई कमांड विंडो फिर से नहीं! एक चेतावनी यह है कि मुझे अपनी स्थिति में एसटीडीआईएन घटना के रूप में पढ़ने के लिए आईएच के लिए एक खाली फ़ाइल की आवश्यकता है, इसकी आवश्यकता नहीं थी।

+0

ऐसा लगता है कि आपका कोड पूरा नहीं हुआ है। "इनएचएच" क्या है? – oshyshko

+0

शायद वर्तमान निर्देशिका से "' "और' "बाहर" फाइलों की तुलना में आपूर्ति करने के लिए बेहतर हैंडल हैं? – Cirdec

संबंधित मुद्दे