# <10> ファイバー (Delphi コンカレントプログラミング) --- tags: Delphi programming Pascal embarcadero objectpascal created_at: 2022-11-27 updated_at: 2022-12-06 --- # 10. ファイバー **ファイバー** (Fiber) は軽量スレッド (Lightweight Thread) や、マイクロスレッド (Micro Thread) とも呼ばれます。端的に言えば、並行動作しない疑似的なスレッドです。 ファイバーは実質的に **コルーチン** と同じで、Pascal の後継言語である Modula-2 にはコルーチンが実装されています。Pascal の方言にもコルーチンが実装されたものがあったようです。 - [ファイバー (コンピュータ) (Wikipedia)](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%90%E3%83%BC_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF)) - [コルーチン (Wikipedia)](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3) - [割と簡単に ’標準 Modula-2 / Oberon-2' を試してみたい (Qiita)](./8e8be01f749915167a91.md) ## 10.1. Delphi とファイバー Delphi にはファイバー (やコルーチン) は実装されていません。 Windows にはファイバー API が存在するので、Windows アプリケーションの場合にはこれを使う事になります。ファイバー API は `Winapi.Windows` 名前空間で定義されています。 | Windows API | 説明 | |:---|:---| | [CreateFiber()](https://learn.microsoft.com/ja-jp/windows/win32/api/winbase/nf-winbase-createfiber) | ファイバー オブジェクトを割り当て、スタックを割り当て、指定した開始アドレス (通常はファイバー関数) で開始するように実行を設定します。 | | [CreateFiberEx()](https://learn.microsoft.com/ja-jp/windows/win32/api/winbase/nf-winbase-createfiberex) | ファイバー オブジェクトを割り当て、スタックを割り当て、指定した開始アドレス (通常はファイバー関数) で開始するように実行を設定します。 | | [SwitchToFiber()](https://learn.microsoft.com/ja-jp/windows/win32/api/winbase/nf-winbase-switchtofiber) | ファイバーをスケジュールします。 | | [ConvertFiberToThread()](https://learn.microsoft.com/ja-jp/windows/win32/api/winbase/nf-winbase-convertfibertothread) | 現在のファイバーをスレッドに変換します。 | | [ConvertThreadToFiber()](https://learn.microsoft.com/ja-jp/windows/win32/api/winbase/nf-winbase-convertthreadtofiber) | 現在のスレッドをファイバーに変換します。
※ Delphi での定義が間違っています。 | | [ConvertThreadToFiberEx()](https://learn.microsoft.com/ja-jp/windows/win32/api/winbase/nf-winbase-convertthreadtofiberex) | 現在のスレッドをファイバーに変換します。 | | [DeleteFiber()](https://learn.microsoft.com/ja-jp/windows/win32/api/winbase/nf-winbase-deletefiber) | 既存のファイバーを削除します。 | | [IsThreadAFiber()](https://learn.microsoft.com/ja-jp/windows/win32/api/fibersapi/nf-fibersapi-isthreadafiber) | 現在のスレッドがファイバーであるかどうかを判断します。 | ファイバー API はかなり古くからある API で、Windows NT 3.51 SP3 で実装されています。 ![image.png](./images/b64be1bb-2d0f-4670-86b9-e300a2ce32d1.png) 画像は Nifty-Serve の FDELPHI に投稿されたファイバー API の使用例を実行してみたところです。2つの PaintBox を同時にグラデーション描画します。 **See also:** - [ファイバー (learn.microsoft.com)](https://learn.microsoft.com/ja-jp/windows/win32/procthread/fibers) - [ファイバーの使用 (learn.microsoft.com)](https://learn.microsoft.com/ja-jp/windows/win32/procthread/using-fibers) - ["Fiber(ファイバ)" - FDELPHI (DelFusa Floor)](http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/samples/01186.html) - [Coroutine - ObjectPascal Magic Programming (いつも心に工事中!)](https://hp.vector.co.jp/authors/VA028375/delphi/delphipascal_xx_coroutine.html) - [The ConvertThreadToFiber() API is incorrectly defined (Quality Portal)](https://quality.embarcadero.com/browse/RSP-40148) ## 10.2. Windows のユーザーモードスケジューラ (UMS) Windows 7 で実装された **ユーザーモードスケジューラ (UMS)** は端的に言えば「ファイバーのような機構を提供するもの」です。 - 64bit カーネル 専用。 - Windows 10 が Anniversary Update 以降の場合、Ivy Bridge よりも前の CPU では動作しない。 - (2022/12 現在) Windows 11 では動作しない。 うーん。 **See also:** - [ユーザーモードスケジューリング (learn.microsoft.com)](https://learn.microsoft.com/ja-jp/windows/win32/procthread/user-mode-scheduling) - [Inside Windows 7: Dave Probert - User Mode Scheduler (UMS) (Youtube)](https://www.youtube.com/watch?v=PYlP8MXRCZc) - [Bringing Call Gates Back (ALEX IONESCU’S BLOG)](http://www.alex-ionescu.com/?p=340) # 索引 [ [← 9. 非同期プログラミングライブラリ (APL)](./eedf3728be2a301a8a5d.md) ] [ [↑ 目次へ](https://qiita.com/items/e8c1ff3a4c74e4c2a4f3) ] [ [→ 付録](./2f8d55f69d30ba622d3b.md) ]