Anzeige:
Ergebnis 1 bis 12 von 12

Thema: CreateThread in VC++

  1. #1
    Registrierter Benutzer
    Registriert seit
    30.01.2003
    Beiträge
    97

    CreateThread in VC++

    Hallo,

    ich habe in meinem Programm nen Aufruf
    Aktion = MitSpieler[0].machZug();

    Da die Methode etwas rechenintensiv ist, liegt solange die GUI still. Wie kann ich für den Aufruf einen neuen Thread erzeugen?

    Mein Problem ist vor allem der RETURN-Wert von der Funktion.

    thx
    phoku
    Geändert von phoku (11-06-2004 um 11:11 Uhr)

  2. #2
    Registrierter Benutzer
    Registriert seit
    12.02.2001
    Beiträge
    30
    Code:
    HANDLE mutx;
    Aktion my_Aktion = NULL;
    
    
    DWORD WINAPI my_thread(void *par)
    {	
    	//
    	// HIER DEINEN CODE
    	//
    
    	// alles berechnet, Rueckgabewert setzten
    
    	WaitForSingleObject (mutx, 1000);
    	my_Aktion = mein_rueckgabe_wert;
    	ReleaseMutex (mutx);
    
    	return 0;
    }
    
    
    int main ()
    {
    	HANDLE threadHandle;
    	DWORD threadId = 0;
    
    
    	//
    	// HIER DEINEN CODE
    	//
    
    	// Mutex erzeugen
    	mutx = CreateMutex (NULL, false, NULL);
    
    	// Tread erzeugen
    	threadHandle = CreateThread (0, 0x1000, &my_thread, 0, 0, &threadId);
    
    	//
    	// FOO BAR (irgendwas anderes machen...)
    	//
    
    	// jetzt sollte alles berechnet sein, ueberpruefen...
    	// falls Berechnung noch nicht fertig: warten
    	for (;;)
    	{
    		WaitForSingleObject (mutx, 1000);
    		if (my_Aktion != NULL)
    		{
    			ReleaseMutex (mutx);
    			break;
    		}
    		ReleaseMutex (mutx);
    		Sleep (10);
    	}
    
    	//
    	// MEHR VON DEINEM CODE
    	//
    
    	return 0;
    }

    Ganz simpel mit einem Mutex, Fehler werden hier nicht abgefangen.
    The main failure in computers is usually between keyboard and chair.

  3. #3
    Registrierter Benutzer
    Registriert seit
    12.02.2001
    Beiträge
    30
    Ich habe eben erst gesehen dass du das ganze in eine GUI packen willst.

    Das ist wesentlich komplizierter, da du der CreateThread-Funktion keine Memberfunktionen übergeben darfst.

    Um die Methode einer Klasse als Thread laufen zu lassen, musst du eine Funktion ausserhalb der Klasse schreiben, welche als Übergabeparameter einen Funktions-Pointer auf die Member-Klasse hat, die Funktion ruft die CreateThread-Funktion mit dem übergebenen Funktionspointer auf. In der Klasse selbst rufst du dann die externe Funktion mit dem Pointer auf die Klassenmethode auf.

    Sehr unschön, aber was will man machen...


    Thomas.
    The main failure in computers is usually between keyboard and chair.

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Hab bei Google einige CThread Implementierungen gefunden, also eine Art Threadklasse für MFC, falls du das benutzt.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer
    Registriert seit
    30.01.2003
    Beiträge
    97
    Hallo, hab das jetzt wie folgt:
    Code:
    HANDLE mutx;
    Spieleraktion my_Aktion;
    int warten;
    void prePareNegamax(int thisfeld[SIZE][SIZE])
    {...};
    
    DWORD WINAPI my_thread(void *par)
    {	
    	prePareNegamax(par);
    
    	WaitForSingleObject (mutx, 1000);
    	warten = 0;
    	ReleaseMutex (mutx);
    
    	return 0;
    }
    
    	Spieleraktion machZug(int thisfeld[SIZE][SIZE])
    	{
    		HANDLE threadHandle;
    		DWORD threadId = 0;
    		warten=1;
    
    		//
    		// HIER DEINEN CODE
    		//
    
    		// Mutex erzeugen
    		mutx = CreateMutex (NULL, false, NULL);
    
    		// Tread erzeugen
    		threadHandle = CreateThread (0, 0x1000, &my_thread, thisfeld, 0, &threadId);
    
    		//
    		// FOO BAR (irgendwas anderes machen...)
    		//
    
    		// jetzt sollte alles berechnet sein, ueberpruefen...
    		// falls Berechnung noch nicht fertig: warten
    		for (;;)
    		{
    			WaitForSingleObject (mutx, 1000);
    			if (!warten)
    			{
    				ReleaseMutex (mutx);
    				break;
    			}
    			ReleaseMutex (mutx);
    			Sleep (10);
    		}
    		return my_Aktion ;
    	}
    bekomme aber Fehlermeldungen:
    error C2664: 'ComputerSpieler:rePareNegamax' : cannot convert parameter 1 from 'void *' to 'int [][15]'
    error C2276: '&' : illegal operation on bound member function expression

  6. #6
    Registrierter Benutzer
    Registriert seit
    12.02.2001
    Beiträge
    30
    DWORD WINAPI my_thread(void *par)
    Du kannst als Parameter also nur einen void-Pointer übergeben.

    Entweder du castest dein Array nach "void *" oder zu kopierst das Array in eine globale Variable um, auf welche der Thread zugreifen kann, um auf den Übergabeparameter zu verzichten.
    The main failure in computers is usually between keyboard and chair.

  7. #7
    Registrierter Benutzer
    Registriert seit
    30.01.2003
    Beiträge
    97
    okay, wenn ich
    Code:
    threadHandle =  CreateThread(NULL,0,ThreadMain,NULL,0,&threadId);
    mache gibt er mir aber dann die Fehlermeldung
    C2664: 'CreateThread' : cannot convert parameter 3 from 'void (void)' to 'LPTHREAD_START_ROUTINE'

    ein & vor ThreadMain nimmt er sowiso nicht
    Geändert von phoku (12-06-2004 um 12:40 Uhr)

  8. #8
    Registrierter Benutzer
    Registriert seit
    12.02.2001
    Beiträge
    30
    Ich habe hier jetzt kein Windows, daher alles aus dem Gedächtnis...
    Code:
    threadHandle =  CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadMain,NULL,0,&threadId);
    Sieht logisch aus, oder?
    The main failure in computers is usually between keyboard and chair.

  9. #9
    Registrierter Benutzer
    Registriert seit
    30.01.2003
    Beiträge
    97
    klar, sieht logisch aus. hab ich auch schon versucht, aber dann kommt:
    error C2440: 'type cast' : cannot convert from 'overloaded-function' to 'LPTHREAD_START_ROUTINE'

  10. #10
    Registrierter Benutzer
    Registriert seit
    12.02.2001
    Beiträge
    30
    Code:
    DWORD WINAPI thread( PVOID par )
    {
    // WHATEVER
    return 0;
    }
    
                                                                                                                        
    int main( int argc, char *argv[])
    {
    // VARIABLEN ETC
    
    threadHandle = CreateThread(0,0x1000,thread,0,0,&threadId);
    SetThreadPriority(threadHandle,THREAD_PRIORITY_TIME_CRITICAL);
    
    // FOO BAR
    }
    Habe ich eben aus was altem auf meiner Platte rausgekramt, ich kann nur wie gesagt nicht testen, ob alles glatt läuft. Müsste aber!
    The main failure in computers is usually between keyboard and chair.

  11. #11
    Registrierter Benutzer
    Registriert seit
    30.01.2003
    Beiträge
    97
    ne, da krieg ich die gleiche Fehlermeldung:
    error C2664: 'CreateThread' : cannot convert parameter 3 from 'DWORD (PVOID)' to 'LPTHREAD_START_ROUTINE'

  12. #12
    Registrierter Benutzer
    Registriert seit
    12.02.2001
    Beiträge
    30
    Code:
    #include <windows.h>
    #include <iostream>
    
    DWORD WINAPI thread (PVOID par)
    {
    	for (int i = 0; i < 999; i++)
    	{
    		std::cout << "THREAD" << std::endl;
    		Sleep (1);
    	}
    
    
    	return 0;
    }
    
    
    int main (int argc, char *argv[])
    {
    	HANDLE threadHandle;
    	unsigned long threadId;
    
    	threadHandle = CreateThread(0,0x1000,thread,0,0,&threadId);
    	
    	
    	for (int i = 0; i < 999; i++)
    	{
    		std::cout << "MAIN" << std::endl;
    		Sleep (1);
    	}
    
    	
    	return 0;
    }

    Ich habe das eben bei der Arbeit geschrieben und es compiliert ohne Probleme.
    Ich habe das Visual Studio 6 benutzt.


    Thomas.
    The main failure in computers is usually between keyboard and chair.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •