Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   TFiber - Fiber Klasse für Delphi (https://www.delphipraxis.net/139832-tfiber-fiber-klasse-fuer-delphi.html)

tyberis 6. Sep 2009 13:55


TFiber - Fiber Klasse für Delphi
 
Liste der Anhänge anzeigen (Anzahl: 1)
TFiber

Die Klasse TFiber stellt eine separate "Ausführungsumgebung" zur Verfügung, die unabhängig von Threads existiert. Diese hat einen eigenen Satz von Registers, Stack, Exception Chain und Instruction Pointer.

Im Gegensatz zu einem Thread wird ein Fiber nicht vom Betriebsystem verwaltet und ausgeführt, sondern muss manuell in einem Thread der Wahl ausgeführt werden. Daher sieht das Starten eines Fibers erst mal aus wie ein normaler Funktionsaufruf. Der Vorteil ist aber, dass die Ausführung eines Fibers an einer beliebigen Stelle gestoppt und zu einem späteren Zeit forgesetzt werden kann. Ausserdem ist es möglich, mit einem einfachen Funktionsaufruf an beliebiger Stelle im Kontrollfluss ein Fiber von einem Thread auf einen anderen zu transferieren.

Anwendungsfälle
- Fibers können verwendet werden, um an beliebiger Stelle während der Ausführung den Thread zu wechseln, bspw. um den MainThread freizugeben.

- Fibers können verwendet werden, um CoRoutinen zu implementieren.

- Fibers können die Anzahl Threads reduzieren, wenn sehr viele Ausführungspfade existieren, diese aber nicht ständig laufen. So kann der Fiber inaktiv sein, bis wieder Arbeit ansteht, um dann wieder in einem Thread aus einem Threadpool ausgeführt zu werden.

Features
- Transparentes Exception Handling über Thread-Grenzen hinweg.
- "Inline" Wechsel zwischen MainThread und Worker-Thread aus einem ThreadPool
- Direkter Transfer von einem Fiber in einen anderen möglich

Methoden von TFiber
- SwitchToWorkerThread: Ausführung in einem WorkerThread fortführen
- SwitchToMainThread: Ausführung im MainThread fortführen
- Yield: Kontrolle an Thread zurückgeben
- Transition: Kontrolle an anderen Fiber übergeben
- Resume: Kontrolle von Thread an Fiber übergeben

Properties von TFiber
- FreeOnTerminate: Instanz automatisch freigeben, wenn der Ausführungspfad des Fibers abgeschlossen ist.

Die Units mit Beispielprojekt im Anhang oder hier. Falls jemand nach einer ThreadPool Implementierung sucht ist hier eine mit dabei.

Beispiel
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Fiber: TEventFiber;
begin
  Fiber := TEventFiber.Create;
  Fiber.FreeOnTerminate := True;
  Fiber.Run(Sender, Button1Click2);
end;

// This code is run in a fiber
procedure TForm1.Button1Click2(Sender: TObject; Fiber: TFiber);
begin
  // ...
  // Switch to worker thread, free UI thread
  Fiber.SwitchToWorkerThread;
  try
    // Do something in the worker thread
    // ...
  finally
    // Switch back to MainThread
    Fiber.SwitchToMainThread;
  end;
  // ...
end;
Edit: Falsches Zip-File durch korrektes ersetzt :)

Federico Pintado 29. Jul 2014 06:07

AW: TFiber - Fiber Klasse für Delphi
 
Sorry to ask but, how to compile this on 64 bit? It seems this is the same version as http://www.entwickler-ecke.de/viewtopic.php?t=94597 but it will not compile.
Unfortunately original author not respond.

Stevie 29. Jul 2014 06:51

AW: TFiber - Fiber Klasse für Delphi
 
There is a fiber implementation in DSharp that does work on 64-bit windows aswell.
It uses the Windows Fiber API.

Federico Pintado 29. Jul 2014 06:54

AW: TFiber - Fiber Klasse für Delphi
 
So is there advantage of either solution? Why was it written with assembler?

Thanks

Stevie 29. Jul 2014 07:04

AW: TFiber - Fiber Klasse für Delphi
 
Zitat:

Zitat von Federico Pintado (Beitrag 1266871)
So is there advantage of either solution? Why was it written with assembler?

Thanks

The assembler version theoretically works on any x86 target (older Windows versions, OSX or others when you are using FPC) but I never tested it.
Using the windows API restricts it to Windows XP/Server 2003 and up but works well.

There is also another implementation (asm based for x86 only though) out there but I never got it to work properly (just mentioning it for completeness).

Federico Pintado 29. Jul 2014 07:05

AW: TFiber - Fiber Klasse für Delphi
 
Thanks, I will stick with Winapi. Easier to understand.

There is this implementation too, not sure if from the same author.

http://svn.zdechov.net/trac/PascalCl...ing?order=name


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz