AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte TFiber - Fiber Klasse für Delphi

TFiber - Fiber Klasse für Delphi

Ein Thema von tyberis · begonnen am 6. Sep 2009 · letzter Beitrag vom 29. Jul 2014
Antwort Antwort
tyberis
Registriert seit: 18. Mär 2005
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
Angehängte Dateien
Dateityp: zip fibers_134.zip (236,6 KB, 110x aufgerufen)
 
Federico Pintado
 
#2
  Alt 29. Jul 2014, 06:07
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.

Geändert von Federico Pintado (29. Jul 2014 um 06:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#3
  Alt 29. Jul 2014, 06:51
There is a fiber implementation in DSharp that does work on 64-bit windows aswell.
It uses the Windows Fiber API.
Stefan

Geändert von Stevie (29. Jul 2014 um 06:53 Uhr)
  Mit Zitat antworten Zitat
Federico Pintado
 
#4
  Alt 29. Jul 2014, 06:54
So is there advantage of either solution? Why was it written with assembler?

Thanks
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#5
  Alt 29. Jul 2014, 07:04
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).
Stefan

Geändert von Stevie (29. Jul 2014 um 07:07 Uhr)
  Mit Zitat antworten Zitat
Federico Pintado
 
#6
  Alt 29. Jul 2014, 07:05
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

Geändert von Federico Pintado (29. Jul 2014 um 09:28 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:47 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