2012-11-29 10 views
9

के साथ कोई नाम चल रहा है या नहीं, यह जांचने के लिए कि कोई प्रोग्राम कैसे चल रहा है, क्यूटी (सी ++) के साथ, यह जांचने के लिए कि कोई प्रोग्राम कैसे चल रहा है या नहीं।क्यूटी (सी ++)

क्या QProcess::pid काम करेगा? मुझे नहीं पता कि इसका उपयोग कैसे करें। कृपया सुझाव दे।

+2

[यह सवाल] (http://stackoverflow.com/questions/10422145/how-to-check-if-a-process-is-running-or-not) लगता है जब तक आपके पास ऑब्जेक्ट हो, तब तक अपनी ज़रूरतों को पूरा करें। – chris

+0

हां, लेकिन मुझे नहीं पता कि QProcess :: state() का उपयोग कैसे करें? QProcess :: राज्य ("chrome.exe"); ?? – Random78952

+1

संभवतः आप कुछ फ़ंक्शन का उपयोग करके प्रक्रिया नाम से 'QProcess' ऑब्जेक्ट प्राप्त कर सकते हैं और फिर उसे उस पर कॉल कर सकते हैं। – chris

उत्तर

16

जहां तक ​​मुझे पता है कि क्यूप्रोसेस आपको ऐसा करने की अनुमति नहीं देगा (जब तक कि आप प्रक्रिया को स्वयं नहीं बनाते) और वास्तव में क्यूटी में कुछ भी नहीं होगा।

http://msdn.microsoft.com/en-us/library/ms682623.aspx

आप निम्नलिखित समारोह के साथ PrintProcessNameAndID की जगह की जरूरत है पाने के लिए:: हालांकि Win32 एपीआई को प्राप्त करने के लिए आप क्या EnumProcesses समारोह और कैसे उपयोग करने के लिए यह माइक्रोसॉफ्ट की वेबसाइट पर उपलब्ध कराया जाता है की एक पूरी उदाहरण के माध्यम से चाहते हैं एक तरीका प्रदान करता

bool matchProcessName(DWORD processID, std::string processName) 
{ 
    TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>"); 

    // Get a handle to the process. 

    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | 
            PROCESS_VM_READ, 
            FALSE, processID); 

    // Get the process name. 

    if (NULL != hProcess) 
    { 
     HMODULE hMod; 
     DWORD cbNeeded; 

     if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), 
      &cbNeeded)) 
     { 
      GetModuleBaseName(hProcess, hMod, szProcessName, 
           sizeof(szProcessName)/sizeof(TCHAR)); 
     } 
    } 

    // Compare process name with your string   
    bool matchFound = !_tcscmp(szProcessName, processName.c_str()); 

    // Release the handle to the process.  
    CloseHandle(hProcess); 

    return matchFound; 
} 
+0

पर काम करना चाहिए डाउनवोट के बारे में टिप्पणी करने के लिए? डाउनवोट की क्षतिपूर्ति के लिए – jaho

+1

+1; यकीन नहीं है कि यह क्यों कम किया गया था। मैं अपनी प्रतिक्रिया में एक ही पृष्ठ के लिए एक लिंक शामिल करने जा रहा था। यह निश्चित रूप से ऐसा करने का आधिकारिक तरीका है। –

8

एक त्वरित और गंदे तरीके से करना यह सिर्फ tasklist के उत्पादन में जाँच करने के लिए हो सकता है, कुछ की तरह:

bool isRunning(const QString &process) { 
    QProcess tasklist; 
    tasklist.start(
     "tasklist", 
     QStringList() << "/NH" 
         << "/FO" << "CSV" 
         << "/FI" << QString("IMAGENAME eq %1").arg(process)); 
    tasklist.waitForFinished(); 
    QString output = tasklist.readAllStandardOutput(); 
    return output.startsWith(QString("\"%1").arg(process)); 
} 

EnumProcesses का उपयोग करना शायद एक बेहतर तरीका है (यानी। अधिक "शुद्ध"; निश्चित रूप से अधिक प्रदर्शन करने वाला), लेकिन यह तब तक "पर्याप्त अच्छा" हो सकता है जब तक कि इसे एक बड़े पाश या किसी चीज़ में नहीं कहा जा रहा हो। एक ही विचार को अन्य प्लेटफॉर्म पर भी पोर्ट किया जा सकता है, हालांकि स्पष्ट रूप से कमांड टूल और पार्सिंग तर्क अलग होगा।

0
//How to Run App 
bool ok = QProcess::startDetached("C:\\TTEC\\CozxyLogger\\CozxyLogger.exe"); 
qDebug() << "Run = " << ok; 


//How to Kill App 
system("taskkill /im CozxyLogger.exe /f"); 
qDebug() << "Close"; 

enter image description here

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