process has exited abfragen



  • hallo gemeinde, ich habe folgendes problem, ich möchte von einem externen programm abfragen ob es ausgeführt wird oder nicht und entsprechende bilder und labels anzeigen. hab es bis dato so versucht aber irgendwie komme ich auf keinen grünen zweig. danke im voraus.

    private: System::Void btn_berechnung_start(System::Object^  sender, System::EventArgs^  e) {
    		 Process^ myProcess = nullptr;
    		try{
    		String^ std = gcnew String(DYNOFUSS_EXE.c_str());
    		String^ cpu = gcnew String(CPU_ZAHL.c_str());
    		String^ g3d = gcnew String(G3DTIMER.c_str());
    		System::String^ args =  System::String::Concat( "set CCX_NPROC=",cpu,"\n set OMP_NUM_THREADS=",cpu,"\n -c ",pfadcfg," -newfiles -l auto.log -g3dtimer",g3d," -ref Pause");
    		Process^ myProcess = Process::Start(std , args); // "set CCX_NPROC=4 set OMP_NUM_THREADS=4 -c D:\\DYNOFuss\\Config_und_Batch_Dynofuss\\config_ElvoDrive.cfg -newfiles -l auto.log -g3dtimer 1.2 -ref"
    
    		while(  !myProcess->HasExited  )
    			{
    			berechnunggif_label->Visible = true;
    			pictureBox2->Visible = true;
    		    _sleep(1000);
    			}
    
    				}
    		catch(Exception^)
    		{
    			System::Windows::Forms::MessageBox::Show("Öffnen von Dynofuss fehlgeschlagen, korrekten Dateipfad unter (Konfiguration -> Programmpfade) angeben!");
    		}
    			 }
    


  • Anstatt zu pollen (= in der while-Schleife dauerend den Status abzufragen) kannst du die via Exited-Event informieren lassen.

    http://msdn.microsoft.com/en-us/library/system.diagnostics.process.exited.aspx



  • danke ich glaube so läuft es, aber nun bin ich wieder ratlos. ich möchte gerne den inhalt der konsole in eine rich textbox schreiben, leider meckert er rum dass sich die textbox in einem anderen thread befindet 😕

    private: System::Void btn_berechnung_start(System::Object^  sender, System::EventArgs^  e) {
    
    			String^ std = gcnew String(DYNOFUSS_EXE.c_str());
    			String^ cpu = gcnew String (CPU_ZAHL.c_str());
    			String^ g3d = gcnew String(G3DTIMER.c_str());
    			String^ nproc = gcnew String(NPROC.c_str());
    			pin_ptr<const wchar_t> nproc2 = PtrToStringChars(nproc);		
    			pin_ptr<const wchar_t> cpu2 = PtrToStringChars(cpu);			
    
    			System::String^ args =  System::String::Concat( "\n -c ",pfadcfg," -newfiles -l auto.log -g3dtimer",g3d," -ref \n Pause");
    
    			SetEnvironmentVariable(nproc2, cpu2);							//setzen der CCX_NPROC Umgebungsvariable von Calculix
    
    			int threads = str2int(CPU_ZAHL.c_str());						//Bestimmen wieviele Threads benutzt werden sollen
    			omp_set_num_threads(threads);
    
    		try{
    
    			berechnunggif_label->Visible = true;
    			pictureBox2->Visible = true;
    			Process^ myProcess = gcnew Process();
    			myProcess->StartInfo->FileName = std;
    			myProcess->StartInfo->CreateNoWindow = true;
    			myProcess->StartInfo->UseShellExecute = false;
    			myProcess->StartInfo->Arguments = args;
    			myProcess->StartInfo->RedirectStandardOutput = true;
    			myProcess->StartInfo->RedirectStandardInput = true;
    			myProcess->StartInfo->RedirectStandardError = true;
    			myProcess->OutputDataReceived += gcnew DataReceivedEventHandler(this, &Form1::myProcess_OutputDataReceived);
    			myProcess->Start();
    			myProcess->BeginOutputReadLine();
    			myProcess->WaitForExit();
    //				log_textbox ->Text = myProcess->StandardOutput->ReadToEnd();
    
    			// "set CCX_NPROC=4 set OMP_NUM_THREADS=4 -c D:\\DYNOFuss\\Config_und_Batch_Dynofuss\\config_ElvoDrive.cfg -newfiles -l auto.log -g3dtimer 1.2 -ref"
    			berechnunggif_label->Visible = false;
    			pictureBox2->Visible = false;
    
    		if( myProcess->HasExited){
    			berechnunggif_label->Visible = false;
    			pictureBox2->Visible = false;
    			}
    
    			}
    		catch(Exception^ e){
    			System::Windows::Forms::MessageBox::Show("Öffnen von Dynofuss fehlgeschlagen, korrekten Dateipfad unter (Konfiguration -> Programmpfade) angeben!" + e);
    			berechnunggif_label->Visible = false;
    			pictureBox2->Visible = false;
    			}
    }
    
    	void myProcess_OutputDataReceived(Object^ sender, DataReceivedEventArgs^ e)
    	{
    			if(e->Data != nullptr )
    			this->log_textbox->Text += System::String::Concat( e->Data);    //<- hier krachts 
    	}
    


  • Ja, da musst du Invoke(..) der Form oder benutzen.



  • meinst du so? meine textbox bleibt aber immernoch leer 😞

    delegate void MyDelegate(Object^ sender, DataReceivedEventArgs^ e);
    
    	void myProcess_OutputDataReceived(Object^ sender, DataReceivedEventArgs^ e){	
    
    		if ( this->InvokeRequired ) {
    			this->BeginInvoke( 
    			gcnew MyDelegate(this, &Form1::myProcess_OutputDataReceived), 
    			gcnew array<Object^>{sender,e});
                return;
    		} 
            try{
    		if(e->Data != nullptr ) 
    		log_textbox->Text +=  e->Data;
    		}
    		catch(Exception^ f){
    		System::Windows::Forms::MessageBox::Show("Dynofuss Console Read Error" + f);
    		}
    	}
    

    debugger sagt error: cannot obtain value bei e->Data



  • also ist e->Data gleich nullptr?



  • Den obligatorischen Link nicht vergessen: http://www.c-plusplus.net/forum/263084



  • ich wollt eig mit nullptr bewirken dass er überprüft ob er was drinstehen hat, scheinbar komme ich aber irgendwie nichtmal dort hin wenn ich da einen haltepunkt setze. das problem ist dass die oberfläche und alles schon steht die ausführung config auslesen usw geht, nur eben den prozess in die oberfläche zu integrieren macht probleme

    es läuft 😉

    delegate void MyDelegate(Object^ sender, DataReceivedEventArgs^ e);
    
    	void myProcess_OutputDataReceived(Object^ sender, DataReceivedEventArgs^ e){	
    
    		if ( this->InvokeRequired ) {
    			this->BeginInvoke( 
    			gcnew MyDelegate(this, &Form1::myProcess_OutputDataReceived), 
    			gcnew array<Object^>{sender,e});
                return;
    		} 
    
    		try{
    
    		String^ daten = gcnew String (e->Data);
    		//log_textbox->Clear();
    		log_textbox->Text += daten + "\n" ;
    		}
    		catch(Exception^ f){
    		System::Windows::Forms::MessageBox::Show("Dynofuss Console Read Error" + f);
    		}
    	}
    

Anmelden zum Antworten