Dela via


Multitrådning: Skapa arbetstrådar i MFC

En arbetstråd används ofta för att hantera bakgrundsaktiviteter som användaren inte ska behöva vänta på för att fortsätta använda ditt program. Uppgifter som omberäkning och bakgrundsutskrift är bra exempel på arbetstrådar. Det här avsnittet beskriver de steg som krävs för att skapa en arbetstråd. Ämnena omfattar:

Att skapa en arbetstråd är en relativt enkel uppgift. Det krävs bara två steg för att få igång tråden: implementera den kontrollerande funktionen och starta tråden. Det är inte nödvändigt att härleda en klass från CWinThread. Du kan härleda en klass om du behöver en särskild version av CWinThread, men det krävs inte för de flesta enkla arbetstrådar. Du kan använda CWinThread utan ändringar.

Starta tråden

Det finns två överlagrade versioner av AfxBeginThread: en som bara kan skapa arbetstrådar och en som kan skapa både användargränssnittstrådar och arbetstrådar. Om du vill börja köra arbetstråden med den första överlagringen anropar du AfxBeginThread och anger följande information:

  • Adressen till den kontrollerande funktionen.

  • Parametern som ska skickas till den kontrollerande funktionen.

  • (Valfritt) Önskad prioritet för tråden. Standardvärdet är normal prioritet. Mer information om tillgängliga prioritetsnivåer finns i SetThreadPriority i Windows SDK.

  • (Valfritt) Önskad stackstorlek för tråden. Standardvärdet är samma storleksstack som den skapande tråden.

  • (Valfritt) CREATE_SUSPENDED om du vill att tråden ska skapas i ett pausat tillstånd. Standardvärdet är 0 eller starta tråden normalt.

  • (Valfritt) Önskade säkerhetsattribut. Standardvärdet är samma åtkomst som den överordnade tråden. Mer information om formatet för den här säkerhetsinformationen finns i SECURITY_ATTRIBUTES i Windows SDK.

AfxBeginThread skapar och initierar ett CWinThread objekt åt dig, startar det och returnerar dess adress så att du kan referera till det senare. Kontroller görs under hela proceduren för att se till att alla objekt frigörs korrekt ifall någon del av skapandet misslyckas.

Implementera den kontrollerande funktionen

Den kontrollerande funktionen definierar tråden. När den här funktionen har angetts startar tråden och när den avslutas avslutas tråden. Den här funktionen bör ha följande prototyp:

UINT MyControllingFunction( LPVOID pParam );

Parametern är ett enda värde. Värdet som funktionen tar emot i den här parametern är det värde som skickades till konstruktorn när trådobjektet skapades. Den kontrollerande funktionen kan tolka det här värdet på valfritt sätt. Det kan behandlas som ett skalärt värde eller en pekare till en struktur som innehåller flera parametrar, eller så kan den ignoreras. Om parametern refererar till en struktur kan strukturen användas inte bara för att skicka data från anroparen till tråden, utan även för att skicka tillbaka data från tråden till anroparen. Om du använder en sådan struktur för att skicka data tillbaka till anroparen måste tråden meddela anroparen när resultatet är klart. Information om hur du kommunicerar från arbetstråden till anroparen finns i Multithreading: Programming Tips(Flertråds-: Programmeringstips).

När funktionen avslutas ska den returnera ett UINT-värde som anger orsaken till avslutningen. Vanligtvis är den här slutkoden 0 för att indikera framgång, med andra värden som anger olika sorters fel. Detta är helt beroende av genomförandet. Vissa trådar kan behålla användningsantalet objekt och returnera det aktuella antalet användningsområden för objektet. Information om hur program kan hämta det här värdet finns i Multithreading: Terminating Threads (Flertrådstrådar: Avsluta trådar).

Det finns vissa begränsningar för vad du kan göra i ett flertrådat program som skrivits med MFC-biblioteket. Beskrivningar av dessa begränsningar och andra tips om hur du använder trådar finns i Multithreading: Programming Tips.

Kontrollfunktion exempel

I följande exempel visas hur du definierar en kontrollerande funktion och använder den från en annan del av programmet.

UINT MyThreadProc( LPVOID pParam )
{
    CMyObject* pObject = (CMyObject*)pParam;

    if (pObject == NULL ||
        !pObject->IsKindOf(RUNTIME_CLASS(CMyObject)))
    return 1;   // if pObject is not valid

    // do something with 'pObject'

    return 0;   // thread completed successfully
}

// inside a different function in the program
.
.
.
pNewObject = new CMyObject;
AfxBeginThread(MyThreadProc, pNewObject);
.
.
.

Vad vill du veta mer om?

Se även

Multitrådning med C++ och MFC