Prozess-Abfrage in einer Schleife



  • Hallo zusammen,

    ich hab da eine für mich etwas zu komplizierte Aufgabe.

    Problem:

    Ich öffne über einen Button ein externes Programm. Jetzt muss mein Programm so lange warten, bis eine bestimmte Exe aus den Tasks verschwunden ist, damit ich dann mit einem MouseEvent einen Button llicken kann. Allerdings darf der Button erst dann gedrückt werden, wenn die Exe weg ist...Das dauert ca. 5 Sek.

    Also müsste die Abfrage der laufenden Tasks in eine While-Schleife packen, oder?
    Nur darf meine Abfrage auch nicht die CPU belasten.
    So wie ich das jetzt versucht habe, funktioniert das Tool aber nicht... kann mir da mal bitte jemand helfen? 😕

    int x;
    .
    .
    .
    x==1;
    						while(x==1)
    							{
    							hTl_1 = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    
    							if (hTl_1 == INVALID_HANDLE_VALUE) MessageBox (0, TEXT("CreateToolhelp32Snapshot"),TEXT(""), MB_OK);
    								pe.dwSize = sizeof(PROCESSENTRY32);
    
    								if (!Process32First(hTl_1, &pe))	MessageBox (0, TEXT("Process32First"),TEXT(""),MB_OK);
    									if (lstrcmpi(pe.szExeFile, L"PhoneLink.exe \0") == 0) bFound = TRUE;
    									while (!bFound && Process32Next(hTl_1, &pe)) 
    										{
    										if (lstrcmpi(pe.szExeFile, L"PhoneLink.exe \0") == 0) bFound = TRUE;
    										}
    										while (bFound)
    											{
    											x==1;
    											Sleep(1000);
    											}
    
    										else
    											{
    											x==0;
    
    											}
    							}
    


  • bool found = true;
    
    	while(found)
    	{
    		found = false;
    
    		void* snapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    		PROCESSENTRY32 processEntry = { sizeof(PROCESSENTRY32) };
    
    		if(Process32First(snapshotHandle, &processEntry))
    		{
    			do
    			{
    				std::string exeName = processEntry.szExeFile;
    				std::transform(exeName.begin(), exeName.end(), exeName.begin(), tolower);
    
    				if(exeName == "notepad.exe")
    					found = true;
    			}
    			while(Process32Next(snapshotHandle, &processEntry));
    		}
    
    		CloseHandle(snapshotHandle);
    
    		Sleep(100);
    	}
    


  • Hallo Oinfoch,

    danke für Deine Antwort...

    wie bekomme ich das von C++ auf Ansi C umgestrickt?
    nich hauen, aber mir ist das noch was schleierhaft... 😮



  • Ääh, sollte hinhauen:

    bool found = true;
    
    	while(found)
    	{
    		found = false;
    
    		void* snapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    
    		PROCESSENTRY32 processEntry;
    		memset(&processEntry, 0, sizeof(PROCESSENTRY32));
    		processEntry.dwSize = sizeof(PROCESSENTRY32);
    
    		if(Process32First(snapshotHandle, &processEntry))
    		{
    			do
    			{
    				if(!_stricmp(processEntry.szExeFile, "notepad.exe"))
    					found = true;
    			}
    			while(Process32Next(snapshotHandle, &processEntry));
    		}
    
    		CloseHandle(snapshotHandle);
    
    		Sleep(100);
    	}
    


  • wie bekomme ich das von C++ auf Ansi C umgestrickt?
    nich hauen, aber mir ist das noch was schleierhaft...

    Aua, das tut weh!
    Ist dies dein 1. C-Programm?

    also dann:

    ersetze alles was overdesigned aussieht, also z.B. bool (->unsigned char),
    statt true kannst du TRUE/FALSE benutzen, da du offensichtlich windows.h hast

    und den string-Kram

    std::string exeName = processEntry.szExeFile;
    std::transform(exeName.begin(), exeName.end(), exeName.begin(), tolower);
    

    char *exeName = malloc(strlen(processEntry.szExeFile)+1);
    strlwr(strcpy(exeName,processEntry.szExeFile));

    obwohl strlwr kein ANSI ist, aber etwas Arbeit soll für dich ja noch bleiben 😉

    usw.



  • Wutz schrieb:

    char *exeName = malloc(strlen(processEntry.szExeFile)+1);
    strlwr(strcpy(exeName,processEntry.szExeFile));
    

    WTF? (Oder: Aua, das tut weh!)



  • Ach ja?
    Es war doch wohl nach ANSI C gefragt, oder?

    dein
    bool -> ist kein ANSI-C
    true -> ist kein ANSI-C
    false -> ist kein ANSI-C
    _stricmp -> ist kein ANSI-C

    dass er anschließend noch strcmp (ANSI) verwenden muss, sollte doch wohl klar sein?



  • Jetzt kriegt euch nicht wegen mir DAU in die Haare...

    Nein, das ist nicht mein erstes C-Programm, aber normalerweise muss ich keine dauernde Abfrage in der Laufzeit machen, sondern benutze die Prozessabfrage eigentlich nur zum Beenden eines Tasks, oder eben um zu prüfen, ob die läuft.

    Klar, viele Sachen hab ich noch nicht gemacht, aber umsetzen von C++ runter nach C sind für mich jedenfalls bömische Dörfer...

    Ich danke Euch jedenfalls schon mal herzlich... ich teste das mal morgen durch.
    Vielleicht krieg ich das ja hin. 😉



  • Wenn du die PID hast kannst du mit OpenProcess() ein Handle erstellen auf das du dann mit WaitForSingleObject wartest - das ist deutlich besser als die etwas müllige Sleep-Lösung.



  • boolean ExecProggyandwaitforEnd(char *appname, char *cmdline, char *workingdir, boolean showwnd){
    
    	STARTUPINFO			si;
    	PROCESS_INFORMATION	pi;
    
    	memset(&si, 0, sizeof(si));
    	memset(&pi, 0, sizeof(pi));
    	si.cb = sizeof( STARTUPINFO);
    	si.dwFlags = STARTF_USESHOWWINDOW;
    	if(showwnd == FALSE){
    		si.wShowWindow = SW_HIDE;
    		si.lpTitle = "hidden tool";
    	}else{
    		si.wShowWindow = SW_SHOW;
    		si.lpTitle = "visible tool";
    	}
    	if(CreateProcess(appname, cmdline, NULL, NULL, FALSE, 0, NULL, workingdir, &si, &pi) == 0){
    		return FALSE;
    	}
    	WaitForInputIdle(pi.hProcess, INFINITE);
    	WaitForSingleObject(pi.hProcess, INFINITE);
    	CloseHandle(pi.hProcess);
    	return TRUE;
    }
    


  • Uhhh... Danke! 👍

    Das muss ich mir mal in Ruhe ansehen, um das zu begreifen und das in mein Programm einbauen zu können.... 😉


Anmelden zum Antworten