OpenMP Schleife überwachen



  • Hallo zusammen,

    ich habe eine Methode, welche in einer Schleife aufgerufen wird. Die Aufrufe sind unabhängig voneinander und die Schleife funktioniert auch. Dies sieht so aus:

    #pragma omp parallel for
    			for(int i=0;i<nodes.size();i++)														        
                {
    				if ( worker->CancellationPending )
    				{	
    					e->Cancel = true;
    				}
    				else
    				{
    					CutPlane cutplane(grid1.get_ref_plane(),nodes[i]);
    					new_nodes[i]=grid1.fd_path_refpoint(&cutplane,&nodes[i]);
    					worker->ReportProgress(num);
    				}
    			}
    

    Das Ganze ist in einer GUI eingebettet.
    Da die Methode fd_path_refpoint() aufgrund von unpassenden Nutzereingaben möglicherweise nicht terminiert (ist aufgrund des Algorithmus nicht zu verhindern), möchte ich auf diesen Sachverhalt hinweisen, falls es dazu kommt. Die Idee ist, eine Meldung auszugeben, falls die Methode länger als z.B. 30sek rechnet und die Schleife nicht fortschreitet. Dies habe ich in der nicht parallelisierten Version über einen Timer und die timer_tick-Methode realisiert. Auch dies funktioniert und sieht so aus:

    my_timer->Enabled=true;		
    			for(int i=0;i<nodes.size();i++)																							
    			{	
    				if ( worker->CancellationPending )
    				{	
    					e->Cancel = true;
    				}
    				else
    				{
    					CutPlane cutplane(grid1.get_ref_plane(),nodes[i]);
    					new_nodes[i]=grid1.fd_path_refpoint(&cutplane,&nodes[i]);
    					worker->ReportProgress(num);
    					k=0;
    				}
    			}
    			my_timer->Enabled=false;
    
    private: System::Void my_timer_tick(System::Object^  sender, System::Timers::ElapsedEventArgs^  e)									{	
    
    	if(k>30)
    	{	
    		if(l<2)
    		{
    		l=2;
    		Schließen->Enabled=true;
    		Abbrechen->Enabled=false;
    		MessageBox:: Show("Bearbeitung eines Punktes kann womöglich nicht abgeschlossen werden. Schließen sie zum Abbrechen die Anwendung und überprüfen sie, ob das Netz oder die Referenzebene geeignet ist." ,"Zeitüberschreitung");
    
    		}
    
    	}
    	k+=1;
    }
    

    k und l und der Timer sind natürlich passend initialisiert.

    Versucht habe ich es damit, k privat für die Threads zu machen usw. jedoch ohne Erfolg. Gibt es eine Möglichkeit die Variante die ich ohne openMP nutze, für openMP zu modifizieren? Bin neu auf diesem Gebiet und finde dazu nichts. Ich freue mich über eure (konstruktiven) Antworten.
    Danke schon im Voraus.

    LG Gebb



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten