Parameterübergabe an Thread in einer klasse



  • Hallo,

    folgende Situation: Ich würde meinen Threads gerne Zugriff auf den vector Tabelle erlauben. Wahrscheinlich seh ich den Wald vor lauter Bäumen nicht mehr aber wie kann ich den mit übergeben?

    class Searcher_Class
    {
    private:
    	struct Datensatz
    	{
    		string item_no;
    		string name;
    	};
    	struct THREADDATA
    	{
    		unsigned int Range_from;
    		unsigned int Range_to;
    		string Suchbegriff;
    	};
    
    	unsigned int Anzahl_gefundener_Datensätze;
    	vector<Datensatz> Tabelle;
    
    	static DWORD WINAPI Searcher_Thread(LPVOID lpParam)
    	{
    		THREADDATA *Range = reinterpret_cast<THREADDATA*>(lpParam);
    
    		for(Range->Range_from; Range->Range_from <= (Range->Range_to); Range->Range_from++)
    		{
    			if((Tabelle[Range->Range_from].item_no.find(Range->Suchbegriff) != string::npos) || (Tabelle[Range->Range_from].name.find(Range->Suchbegriff) != string::npos))
    			{
    				Anzahl_gefundener_Datensätze += 1;
    			}
    		}
    		return 0;
    	}
    
    	void Search(string Begriff)
    	{
    		unsigned int Tabellengröße = Tabelle.size();
    		unsigned int Rest		   = Tabellengröße % Core->dwNumberOfProcessors;
    		unsigned int Range		   = (Tabellengröße - Rest) / Core->dwNumberOfProcessors;
    		unsigned int Index		   = 0;
    		caseInsensitiveString(Begriff, string(""));
    
    		THREADDATA *Threaddaten = new THREADDATA[Core->dwNumberOfProcessors];
    		for(unsigned int i = 0; i <= (Core->dwNumberOfProcessors - 1); i++)
    		{
    			Threaddaten[i].Suchbegriff	= Begriff;
    			Threaddaten[i].Range_from	= Index;
    
    			if((i != (Core->dwNumberOfProcessors - 1)) || Rest == 0)
    			{
    				Index += Range - 1;
    				Threaddaten[i].Range_to = Index;
    				Index += 1;
    			}
    			else
    			{
    				Index += Rest;
    				Threaddaten[i].Range_to = Index;
    			}
    		}
    
    		HANDLE *ThreadHandle = new HANDLE[Core->dwNumberOfProcessors];
    		for(unsigned int i = 0; i <= (Core->dwNumberOfProcessors - 1); i++)
    		{
    			ThreadHandle[i] = CreateThread(0, NULL, (LPTHREAD_START_ROUTINE)Searcher_Thread, (LPVOID)&Threaddaten[i], NULL, NULL);
    		}
    		WaitForMultipleObjects(Core->dwNumberOfProcessors, ThreadHandle, TRUE, INFINITE);
         }
    }
    


  • Nimm einen Zeiger auf die Tabelle in die Struktur THREADDATA auf.


Log in to reply