SDL CreateThread
Inhaltsverzeichnis
SDL_CreateThread
Name
SDL_CreateThread - Erzeugt einen neuen Thread der Zugriff auf alle Speicherbereiche der Hauptanwendung hat.
Delphi-Spezifikation
function SDL_CreateThread(fn: PInt; data: Pointer): PSDL_Thread;
Parameter
fn | Erwartet einen Zeiger auf eine Funktion mit den Anweisungen, die der Thread ausführen soll. Diese Funktion sollte einen Integer als Rückgabewert liefern, damit beim verlassen des Threads ein Rückgabewert ausgelesen werden kann. |
---|---|
data | Ein Pointer dessen Inhalt als Parameter der aufgerufenen Funktion zur Verfügung gestellt wird. |
Beschreibung
SDL_CreateThread erzeugt und führt einen neuen Thread aus, der als Parameter fn übergeben wird. Der neue Thread teilt sich mit mit dem Hauptthread gemeinsam den Speicherbereich. Dies kann zu schwer nachvollziehbaren Fehlern führen, wenn zwei Threads gleichzeitig versuchen auf einen Speicherbereich zuzugreifen und in Speicherbereiche schreiben. Damit dies verhindert wird, sollte mit Hilfe von SDL_CreateMutex ein Mutex oder mit Hilfe von SDL_CreateSemaphore eine Semaphor erzeugen werden, mit dem sichergestellt werden kann, dass ein Thread exklusiv auf eine Ressource zugreift.
Sobald fn abgearbeitet wurde, beendet sich der Thread.
Hinweise
In der Version 1.2.7 von SDL gibt es einen Fehler. Selbst dann wenn der Thread erfolgreich beendet wird, bleiben immer noch einige Ressourcen im Speicher bestehen. Um diese Ressourcen ebenfalls freizugeben, sollte SDL_WaitThread aufgerufen werden. Geschieht dies nicht wird SDL_CreateThread nach mehr als 1010 erfolgreich erzeugten Threads hängen bleiben.
Rückgabewert
SDL_CreateThread liefert bei Erfolg einen PSDL_Thread zurück über den man den Thread später ansteuern kann. Verlief die Erzeugung nicht erfolgreich entspricht der Rückgabewert NIL.
Beispiel
uses SDL;
var
thread: PSDL_Thread;
returnValue: Integer;
function thread_func(): Integer;
begin
// do threading here
WriteLn('Start Thread');
SDL_Delay(5000);
WriteLn('End Thread');
result := 1; // thread leaves and return this value
end;
begin
returnValue := 0;
thread := SDL_CreateThread(@thread_func, NIL);
SDL_WaitThread(thread, returnValue);
WriteLn('Thread returns code ',returnValue);
SDL_Quit;
WriteLn('ByeBye ;)');
end.