Changeset 140


Ignore:
Timestamp:
Jan 24, 2011, 8:39:52 AM (13 years ago)
Author:
george
Message:
  • Fixed: Execution time measurement.
  • Modified: MicroThread state list changed to virtual list.
Location:
MicroThreading
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • MicroThreading/Demo

    • Property svn:ignore
      •  

        old new  
        11Demo
        22lib
         3Demo.exe
  • MicroThreading/Demo/Demo.lpi

    r135 r140  
    4242      </Item3>
    4343    </RequiredPackages>
    44     <Units Count="22">
     44    <Units Count="28">
    4545      <Unit0>
    4646        <Filename Value="Demo.lpr"/>
     
    5050        <TopLine Value="1"/>
    5151        <CursorPos X="1" Y="15"/>
    52         <UsageCount Value="35"/>
     52        <UsageCount Value="39"/>
    5353      </Unit0>
    5454      <Unit1>
    55         <Filename Value="umainform.pas"/>
     55        <Filename Value="UMainForm.pas"/>
    5656        <IsPartOfProject Value="True"/>
    5757        <ComponentName Value="Form1"/>
    5858        <ResourceBaseClass Value="Form"/>
    5959        <UnitName Value="UMainForm"/>
     60        <IsVisibleTab Value="True"/>
    6061        <EditorIndex Value="0"/>
    6162        <WindowIndex Value="0"/>
    62         <TopLine Value="66"/>
    63         <CursorPos X="1" Y="83"/>
    64         <UsageCount Value="35"/>
     63        <TopLine Value="76"/>
     64        <CursorPos X="27" Y="92"/>
     65        <UsageCount Value="39"/>
    6566        <Loaded Value="True"/>
    6667        <LoadedDesigner Value="True"/>
    6768      </Unit1>
    6869      <Unit2>
    69         <Filename Value="../umicrothreading.pas"/>
     70        <Filename Value="../UMicroThreading.pas"/>
    7071        <UnitName Value="UMicroThreading"/>
    71         <IsVisibleTab Value="True"/>
    72         <EditorIndex Value="7"/>
    73         <WindowIndex Value="0"/>
    74         <TopLine Value="84"/>
    75         <CursorPos X="14" Y="101"/>
    76         <UsageCount Value="18"/>
     72        <EditorIndex Value="10"/>
     73        <WindowIndex Value="0"/>
     74        <TopLine Value="175"/>
     75        <CursorPos X="28" Y="180"/>
     76        <UsageCount Value="20"/>
    7777        <Loaded Value="True"/>
    7878      </Unit2>
     
    120120        <Filename Value="../../ExceptionLogger/UStackTrace.pas"/>
    121121        <UnitName Value="UStackTrace"/>
    122         <EditorIndex Value="4"/>
     122        <EditorIndex Value="8"/>
    123123        <WindowIndex Value="0"/>
    124124        <TopLine Value="56"/>
    125125        <CursorPos X="24" Y="77"/>
    126         <UsageCount Value="18"/>
     126        <UsageCount Value="20"/>
    127127        <Loaded Value="True"/>
    128128        <DefaultSyntaxHighlighter Value="Delphi"/>
     
    131131        <Filename Value="../../ExceptionLogger/CustomLineInfo.pas"/>
    132132        <UnitName Value="CustomLineInfo"/>
    133         <EditorIndex Value="6"/>
     133        <EditorIndex Value="9"/>
    134134        <WindowIndex Value="0"/>
    135135        <TopLine Value="264"/>
    136136        <CursorPos X="37" Y="141"/>
    137         <UsageCount Value="18"/>
     137        <UsageCount Value="20"/>
    138138        <Loaded Value="True"/>
    139139        <DefaultSyntaxHighlighter Value="Delphi"/>
     
    156156      <Unit12>
    157157        <Filename Value="/usr/share/fpcsrc/2.4.0/rtl/i386/i386.inc"/>
    158         <EditorIndex Value="5"/>
    159158        <WindowIndex Value="0"/>
    160159        <TopLine Value="1046"/>
    161160        <CursorPos X="34" Y="1053"/>
    162161        <UsageCount Value="18"/>
    163         <Loaded Value="True"/>
    164162      </Unit12>
    165163      <Unit13>
     
    179177      <Unit15>
    180178        <Filename Value="../../../../lazarus/lcl/include/control.inc"/>
    181         <EditorIndex Value="2"/>
    182179        <WindowIndex Value="0"/>
    183180        <TopLine Value="2271"/>
    184181        <CursorPos X="4" Y="2274"/>
    185182        <UsageCount Value="12"/>
    186         <Loaded Value="True"/>
    187183      </Unit15>
    188184      <Unit16>
    189         <Filename Value="../Coroutine.pas"/>
     185        <Filename Value="../Other/Coroutine.pas"/>
    190186        <UnitName Value="Coroutine"/>
    191         <EditorIndex Value="3"/>
     187        <EditorIndex Value="6"/>
    192188        <WindowIndex Value="0"/>
    193189        <TopLine Value="290"/>
    194         <CursorPos X="51" Y="287"/>
    195         <UsageCount Value="18"/>
     190        <CursorPos X="36" Y="306"/>
     191        <UsageCount Value="20"/>
    196192        <Loaded Value="True"/>
    197193      </Unit16>
     
    226222      <Unit21>
    227223        <Filename Value="/usr/share/fpcsrc/2.4.0/rtl/objpas/sysutils/osutilsh.inc"/>
    228         <EditorIndex Value="1"/>
    229224        <WindowIndex Value="0"/>
    230225        <TopLine Value="8"/>
    231226        <CursorPos X="11" Y="25"/>
    232227        <UsageCount Value="12"/>
    233         <Loaded Value="True"/>
    234228      </Unit21>
     229      <Unit22>
     230        <Filename Value="../MicroThreading.pas"/>
     231        <UnitName Value="MicroThreading"/>
     232        <EditorIndex Value="7"/>
     233        <WindowIndex Value="0"/>
     234        <TopLine Value="1"/>
     235        <CursorPos X="25" Y="9"/>
     236        <UsageCount Value="12"/>
     237        <Loaded Value="True"/>
     238      </Unit22>
     239      <Unit23>
     240        <Filename Value="../../../../Programy/Lazarus/0.9.31_2.4.3/fpc/2.4.3/source/rtl/objpas/dateutil.inc"/>
     241        <EditorIndex Value="1"/>
     242        <WindowIndex Value="0"/>
     243        <TopLine Value="38"/>
     244        <CursorPos X="29" Y="50"/>
     245        <UsageCount Value="12"/>
     246        <Loaded Value="True"/>
     247      </Unit23>
     248      <Unit24>
     249        <Filename Value="../../../../Programy/Lazarus/0.9.31_2.4.3/fpc/2.4.3/source/rtl/objpas/sysutils/datih.inc"/>
     250        <EditorIndex Value="2"/>
     251        <WindowIndex Value="0"/>
     252        <TopLine Value="161"/>
     253        <CursorPos X="11" Y="184"/>
     254        <UsageCount Value="12"/>
     255        <Loaded Value="True"/>
     256      </Unit24>
     257      <Unit25>
     258        <Filename Value="../../../../Programy/Lazarus/0.9.31_2.4.3/fpc/2.4.3/source/rtl/objpas/sysutils/dati.inc"/>
     259        <EditorIndex Value="5"/>
     260        <WindowIndex Value="0"/>
     261        <TopLine Value="254"/>
     262        <CursorPos X="12" Y="258"/>
     263        <UsageCount Value="11"/>
     264        <Loaded Value="True"/>
     265      </Unit25>
     266      <Unit26>
     267        <Filename Value="../../../../Programy/Lazarus/0.9.31_2.4.3/fpc/2.4.3/source/rtl/win/sysutils.pp"/>
     268        <UnitName Value="sysutils"/>
     269        <EditorIndex Value="3"/>
     270        <WindowIndex Value="0"/>
     271        <TopLine Value="581"/>
     272        <CursorPos X="11" Y="585"/>
     273        <UsageCount Value="11"/>
     274        <Loaded Value="True"/>
     275      </Unit26>
     276      <Unit27>
     277        <Filename Value="../../../../Programy/Lazarus/0.9.31_2.4.3/fpc/2.4.3/source/rtl/win/wininc/redef.inc"/>
     278        <EditorIndex Value="4"/>
     279        <WindowIndex Value="0"/>
     280        <TopLine Value="525"/>
     281        <CursorPos X="11" Y="538"/>
     282        <UsageCount Value="11"/>
     283        <Loaded Value="True"/>
     284      </Unit27>
    235285    </Units>
    236286    <JumpHistory Count="30" HistoryIndex="29">
    237287      <Position1>
    238         <Filename Value="../umicrothreading.pas"/>
    239         <Caret Line="49" Column="59" TopLine="17"/>
     288        <Filename Value="../UMicroThreading.pas"/>
     289        <Caret Line="257" Column="44" TopLine="173"/>
    240290      </Position1>
    241291      <Position2>
    242         <Filename Value="umainform.pas"/>
    243         <Caret Line="166" Column="53" TopLine="75"/>
     292        <Filename Value="../UMicroThreading.pas"/>
     293        <Caret Line="141" Column="25" TopLine="125"/>
    244294      </Position2>
    245295      <Position3>
    246         <Filename Value="umainform.pas"/>
    247         <Caret Line="79" Column="1" TopLine="73"/>
     296        <Filename Value="../UMicroThreading.pas"/>
     297        <Caret Line="127" Column="20" TopLine="125"/>
    248298      </Position3>
    249299      <Position4>
    250         <Filename Value="../umicrothreading.pas"/>
    251         <Caret Line="146" Column="1" TopLine="129"/>
     300        <Filename Value="UMainForm.pas"/>
     301        <Caret Line="191" Column="33" TopLine="171"/>
    252302      </Position4>
    253303      <Position5>
    254         <Filename Value="../umicrothreading.pas"/>
    255         <Caret Line="147" Column="1" TopLine="129"/>
     304        <Filename Value="UMainForm.pas"/>
     305        <Caret Line="182" Column="38" TopLine="159"/>
    256306      </Position5>
    257307      <Position6>
    258         <Filename Value="../umicrothreading.pas"/>
    259         <Caret Line="158" Column="1" TopLine="140"/>
     308        <Filename Value="UMainForm.pas"/>
     309        <Caret Line="41" Column="24" TopLine="28"/>
    260310      </Position6>
    261311      <Position7>
    262         <Filename Value="../umicrothreading.pas"/>
    263         <Caret Line="184" Column="1" TopLine="177"/>
     312        <Filename Value="../UMicroThreading.pas"/>
     313        <Caret Line="120" Column="38" TopLine="118"/>
    264314      </Position7>
    265315      <Position8>
    266         <Filename Value="../umicrothreading.pas"/>
    267         <Caret Line="185" Column="1" TopLine="177"/>
     316        <Filename Value="../UMicroThreading.pas"/>
     317        <Caret Line="67" Column="20" TopLine="66"/>
    268318      </Position8>
    269319      <Position9>
    270         <Filename Value="../umicrothreading.pas"/>
    271         <Caret Line="186" Column="1" TopLine="177"/>
     320        <Filename Value="UMainForm.pas"/>
     321        <Caret Line="41" Column="24" TopLine="28"/>
    272322      </Position9>
    273323      <Position10>
    274         <Filename Value="../umicrothreading.pas"/>
    275         <Caret Line="187" Column="1" TopLine="177"/>
     324        <Filename Value="UMainForm.pas"/>
     325        <Caret Line="182" Column="45" TopLine="169"/>
    276326      </Position10>
    277327      <Position11>
    278         <Filename Value="../umicrothreading.pas"/>
    279         <Caret Line="188" Column="1" TopLine="177"/>
     328        <Filename Value="../UMicroThreading.pas"/>
     329        <Caret Line="8" Column="57" TopLine="1"/>
    280330      </Position11>
    281331      <Position12>
    282         <Filename Value="../umicrothreading.pas"/>
    283         <Caret Line="189" Column="1" TopLine="177"/>
     332        <Filename Value="../UMicroThreading.pas"/>
     333        <Caret Line="71" Column="20" TopLine="49"/>
    284334      </Position12>
    285335      <Position13>
    286         <Filename Value="../umicrothreading.pas"/>
    287         <Caret Line="192" Column="1" TopLine="177"/>
     336        <Filename Value="../UMicroThreading.pas"/>
     337        <Caret Line="97" Column="24" TopLine="75"/>
    288338      </Position13>
    289339      <Position14>
    290         <Filename Value="../umicrothreading.pas"/>
    291         <Caret Line="205" Column="1" TopLine="177"/>
     340        <Filename Value="../UMicroThreading.pas"/>
     341        <Caret Line="119" Column="38" TopLine="97"/>
    292342      </Position14>
    293343      <Position15>
    294         <Filename Value="../umicrothreading.pas"/>
    295         <Caret Line="206" Column="1" TopLine="178"/>
     344        <Filename Value="../UMicroThreading.pas"/>
     345        <Caret Line="126" Column="61" TopLine="104"/>
    296346      </Position15>
    297347      <Position16>
    298         <Filename Value="../umicrothreading.pas"/>
    299         <Caret Line="209" Column="1" TopLine="181"/>
     348        <Filename Value="../UMicroThreading.pas"/>
     349        <Caret Line="182" Column="34" TopLine="147"/>
    300350      </Position16>
    301351      <Position17>
    302         <Filename Value="../umicrothreading.pas"/>
    303         <Caret Line="212" Column="1" TopLine="184"/>
     352        <Filename Value="../UMicroThreading.pas"/>
     353        <Caret Line="277" Column="45" TopLine="258"/>
    304354      </Position17>
    305355      <Position18>
    306         <Filename Value="../umicrothreading.pas"/>
    307         <Caret Line="215" Column="1" TopLine="197"/>
     356        <Filename Value="../UMicroThreading.pas"/>
     357        <Caret Line="136" Column="14" TopLine="120"/>
    308358      </Position18>
    309359      <Position19>
    310         <Filename Value="../umicrothreading.pas"/>
    311         <Caret Line="216" Column="1" TopLine="197"/>
     360        <Filename Value="UMainForm.pas"/>
     361        <Caret Line="191" Column="91" TopLine="173"/>
    312362      </Position19>
    313363      <Position20>
    314         <Filename Value="../umicrothreading.pas"/>
    315         <Caret Line="217" Column="1" TopLine="197"/>
     364        <Filename Value="UMainForm.pas"/>
     365        <Caret Line="179" Column="40" TopLine="165"/>
    316366      </Position20>
    317367      <Position21>
    318         <Filename Value="../umicrothreading.pas"/>
    319         <Caret Line="218" Column="1" TopLine="197"/>
     368        <Filename Value="../UMicroThreading.pas"/>
     369        <Caret Line="193" Column="1" TopLine="181"/>
    320370      </Position21>
    321371      <Position22>
    322         <Filename Value="../umicrothreading.pas"/>
    323         <Caret Line="219" Column="1" TopLine="197"/>
     372        <Filename Value="../UMicroThreading.pas"/>
     373        <Caret Line="11" Column="56" TopLine="1"/>
    324374      </Position22>
    325375      <Position23>
    326         <Filename Value="../umicrothreading.pas"/>
    327         <Caret Line="221" Column="1" TopLine="197"/>
     376        <Filename Value="../UMicroThreading.pas"/>
     377        <Caret Line="15" Column="33" TopLine="1"/>
    328378      </Position23>
    329379      <Position24>
    330         <Filename Value="../umicrothreading.pas"/>
    331         <Caret Line="257" Column="35" TopLine="236"/>
     380        <Filename Value="UMainForm.pas"/>
     381        <Caret Line="202" Column="91" TopLine="183"/>
    332382      </Position24>
    333383      <Position25>
    334         <Filename Value="../umicrothreading.pas"/>
    335         <Caret Line="80" Column="38" TopLine="55"/>
     384        <Filename Value="../UMicroThreading.pas"/>
     385        <Caret Line="42" Column="22" TopLine="22"/>
    336386      </Position25>
    337387      <Position26>
    338         <Filename Value="umainform.pas"/>
    339         <Caret Line="83" Column="31" TopLine="66"/>
     388        <Filename Value="../UMicroThreading.pas"/>
     389        <Caret Line="92" Column="1" TopLine="92"/>
    340390      </Position26>
    341391      <Position27>
    342         <Filename Value="../umicrothreading.pas"/>
    343         <Caret Line="104" Column="1" TopLine="74"/>
     392        <Filename Value="UMainForm.pas"/>
     393        <Caret Line="89" Column="19" TopLine="72"/>
    344394      </Position27>
    345395      <Position28>
    346         <Filename Value="../umicrothreading.pas"/>
    347         <Caret Line="90" Column="28" TopLine="73"/>
     396        <Filename Value="../UMicroThreading.pas"/>
     397        <Caret Line="75" Column="22" TopLine="62"/>
    348398      </Position28>
    349399      <Position29>
    350         <Filename Value="../umicrothreading.pas"/>
    351         <Caret Line="9" Column="70" TopLine="1"/>
     400        <Filename Value="UMainForm.pas"/>
     401        <Caret Line="89" Column="22" TopLine="76"/>
    352402      </Position29>
    353403      <Position30>
    354         <Filename Value="../umicrothreading.pas"/>
    355         <Caret Line="10" Column="27" TopLine="1"/>
     404        <Filename Value="../UMicroThreading.pas"/>
     405        <Caret Line="175" Column="9" TopLine="175"/>
    356406      </Position30>
    357407    </JumpHistory>
     
    389439      <Item3>
    390440        <Source Value="umainform.pas"/>
    391         <Line Value="52"/>
     441        <Line Value="56"/>
    392442      </Item3>
    393443      <Item4>
  • MicroThreading/Demo/UMainForm.lfm

    r137 r140  
    11object Form1: TForm1
    2   Left = 445
     2  Left = 298
    33  Height = 510
    4   Top = 107
     4  Top = 144
    55  Width = 703
    66  Caption = 'MicroThreading demo'
    77  ClientHeight = 510
    88  ClientWidth = 703
     9  OnClose = FormClose
    910  OnCreate = FormCreate
    1011  OnDestroy = FormDestroy
     
    1415    Height = 25
    1516    Top = 13
    16     Width = 151
    17     Caption = 'Add new microthread'
     17    Width = 119
     18    Caption = 'Start scheduler'
    1819    OnClick = Button1Click
    1920    TabOrder = 0
     
    4647        Width = 105
    4748      end>
     49    OwnerData = True
    4850    ReadOnly = True
    4951    RowSelect = True
    5052    TabOrder = 1
    5153    ViewStyle = vsReport
     54    OnData = ListView1Data
    5255  end
    5356  object Label1: TLabel
     
    5558    Height = 14
    5659    Top = 8
    57     Width = 85
     60    Width = 74
    5861    Caption = 'Microthread list'
    5962    ParentColor = False
     
    6568    Width = 294
    6669    Anchors = [akTop, akLeft, akBottom]
     70    ScrollBars = ssAutoBoth
    6771    TabOrder = 2
    6872  end
     
    8589    TabOrder = 4
    8690  end
     91  object Label2: TLabel
     92    Left = 10
     93    Height = 14
     94    Top = 40
     95    Width = 32
     96    Caption = 'Label2'
     97    ParentColor = False
     98  end
    8799  object Timer1: TTimer
    88100    Interval = 100
  • MicroThreading/Demo/UMainForm.pas

    r137 r140  
    2424    Button3: TButton;
    2525    Label1: TLabel;
     26    Label2: TLabel;
    2627    ListView1: TListView;
    2728    Memo1: TMemo;
     
    3031    procedure Button2Click(Sender: TObject);
    3132    procedure Button3Click(Sender: TObject);
     33    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    3234    procedure FormCreate(Sender: TObject);
    3335    procedure FormDestroy(Sender: TObject);
     36    procedure ListView1Data(Sender: TObject; Item: TListItem);
    3437    procedure Timer1Timer(Sender: TObject);
    3538  private
     
    3841    Scheduler: TMicroThreadScheduler;
    3942    Test: TTest;
     43    Terminate: Boolean;
    4044  end;
    4145
     
    7478var
    7579  I: Integer;
    76 begin
    77   for I := 0 to 1 do
    78     Scheduler.Add('Worker', Worker);
    79   repeat
    80     Scheduler.Start;
    81     Application.ProcessMessages;
    82     Sleep(1);
    83   until Scheduler.MicroThreadCount = 0;
     80  Executed: Integer;
     81begin
     82  if Button1.Caption = 'Start scheduler' then begin
     83    Button1.Caption := 'Stop scheduler';
     84    Terminate := False;
     85    Scheduler.MicroThreads.Clear;
     86    Memo1.Clear;
     87    for I := 0 to 20 do
     88      Scheduler.Add('Worker', Worker);
     89    repeat
     90      Executed := Scheduler.Execute(10);
     91      Application.ProcessMessages;
     92      if Executed = 0 then Sleep(1);
     93    until (Scheduler.MicroThreadCount = 0) or Terminate;
     94  end else begin
     95    Button1.Caption := 'Start scheduler';
     96    Terminate := True;
     97  end;
    8498end;
    8599
     
    142156end;
    143157
     158procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
     159begin
     160  Terminate := True;
     161end;
     162
    144163procedure TForm1.FormDestroy(Sender: TObject);
    145164begin
     
    148167end;
    149168
    150 procedure TForm1.Timer1Timer(Sender: TObject);
    151 var
    152   I: Integer;
    153   NewItem: TListItem;
     169procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
    154170begin
    155171  try
    156     ListView1.BeginUpdate;
    157     ListView1.Clear;
    158172    Scheduler.Lock.Acquire;
    159     for I := 0 to Scheduler.MicroThreads.Count - 1 do
    160     with TMicroThread(Scheduler.MicroThreads[I]) do begin
    161       NewItem := ListView1.Items.Add;
    162       NewItem.Caption := IntToStr(Id);
    163       NewItem.SubItems.Add(Name);
    164       NewItem.SubItems.Add('');
    165       NewItem.SubItems.Add(IntToStr(Priority));
    166       NewItem.SubItems.Add(MicroThreadStateText[State]);
    167       NewItem.SubItems.Add(FloatToStr(ExecutionTime));
     173    if Item.Index < Scheduler.MicroThreads.Count then
     174    with TMicroThread(Scheduler.MicroThreads[Item.Index]) do begin
     175      Item.Caption := IntToStr(Id);
     176      Item.SubItems.Add(Name);
     177      Item.SubItems.Add('');
     178      Item.SubItems.Add(IntToStr(Priority));
     179      Item.SubItems.Add(MicroThreadStateText[State]);
     180      Item.SubItems.Add(FloatToStr(ExecutionTime));
    168181    end;
    169182  finally
    170183    Scheduler.Lock.Release;
    171     ListView1.EndUpdate;
    172   end;
     184  end;
     185end;
     186
     187procedure TForm1.Timer1Timer(Sender: TObject);
     188begin
     189  ListView1.Items.Count := Scheduler.MicroThreadCount;
     190  ListView1.Items[-1];
     191  ListView1.Refresh;
     192  Label2.Caption := DateTimeToStr(Scheduler.GetNow) + ' ' +
     193    FloatToStr(Frac(Scheduler.GetNow / OneSecond));
    173194end;
    174195
     
    179200  with MicroThread do begin
    180201    Memo1.Lines.Add('Worker ' + IntToStr(Id));
    181     for I := 0 to 10 do begin
    182       Memo1.Lines.Add(InttoStr(Id) + ': ' + IntToStr(I));
    183       Sleep(100 * Id * OneMillisecond);
     202    for I := 0 to 1000 do begin
     203      Memo1.Lines.Add(IntToStr(Id) + ': ' + IntToStr(I) + ' ' +
     204        FloatToStr(ExecutionTime));
     205      //Sleep(1 * Id * OneMillisecond);
     206      Yield;
    184207    end;
    185208  end;
  • MicroThreading/MicroThreading.lpk

    r137 r140  
    22<CONFIG>
    33  <Package Version="3">
    4     <Name Value="Microthreading"/>
     4    <Name Value="MicroThreading"/>
    55    <CompilerOptions>
    66      <Version Value="9"/>
    77      <SearchPaths>
    8         <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)/"/>
     8        <OtherUnitFiles Value="Other"/>
     9        <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
    910      </SearchPaths>
    1011      <Other>
     
    1415    <Files Count="2">
    1516      <Item1>
    16         <Filename Value="umicrothreading.pas"/>
     17        <Filename Value="UMicroThreading.pas"/>
    1718        <UnitName Value="UMicroThreading"/>
    1819      </Item1>
    1920      <Item2>
    20         <Filename Value="Coroutine.pas"/>
     21        <Filename Value="Other/Coroutine.pas"/>
    2122        <UnitName Value="Coroutine"/>
    2223      </Item2>
    2324    </Files>
    2425    <Type Value="RunAndDesignTime"/>
    25     <RequiredPkgs Count="1">
     26    <RequiredPkgs Count="2">
    2627      <Item1>
     28        <PackageName Value="LCL"/>
     29      </Item1>
     30      <Item2>
    2731        <PackageName Value="FCL"/>
    2832        <MinVersion Major="1" Valid="True"/>
    29       </Item1>
     33      </Item2>
    3034    </RequiredPkgs>
    3135    <UsageOptions>
  • MicroThreading/MicroThreading.pas

    r137 r140  
    33 }
    44
    5 unit Microthreading;
     5unit MicroThreading;
    66
    77interface
     
    1717
    1818initialization
    19   RegisterPackage('Microthreading', @Register);
     19  RegisterPackage('MicroThreading', @Register);
    2020end.
  • MicroThreading/UMicroThreading.pas

    r137 r140  
    11unit UMicroThreading;
    22
    3 {$mode objfpc}{$H+}
     3{$mode Delphi}{$H+}
    44{$asmmode intel}
    55
     
    77
    88uses
    9   Classes, SysUtils, Contnrs, SyncObjs, DateUtils,
    10   BaseUnix, UnixUtil, Unix;
     9  {$IFDEF Windows}Windows,{$ENDIF}
     10  {$IFDEF Linux}BaseUnix, UnixUtil, Unix,{$ENDIF}
     11  Classes, SysUtils, Contnrs, SyncObjs, DateUtils, Dialogs;
    1112
    1213type
     
    1516
    1617  TStartEvent = procedure(MicroThread: TMicroThread) of object;
    17 
    18   TCallerAddr = packed record
    19     case Boolean of
    20       True: (A: TStartEvent;);
    21       False: (B, C: Pointer;);
    22   end;
    2318
    2419  TMicroThreadState = (tsReady, tsRunning, tsWaiting, tsBlocked, tsSuspended,
     
    6863    FSelected: TMicroThread;
    6964    FTempPointer: Pointer;
     65    FFrequency: Int64;
     66    FExecuteCount: Integer;
     67    FExecutedCount: Integer;
    7068    function GetMicroThreadCount: Integer;
    7169    procedure Yield(MicroThread: TMicroThread);
     
    7371    MicroThreads: TObjectList; // TList<TMicroThread>
    7472    Lock: TCriticalSection;
     73    function GetNow: TDateTime;
    7574    function Add(Name: string; Method: TStartEvent): TMicroThread;
    7675    constructor Create;
    7776    destructor Destroy; override;
    78     procedure Start;
     77    function Execute(Count: Integer): Integer;
    7978    property MicroThreadCount: Integer read GetMicroThreadCount;
    8079    property FreeMicroThreadOnFinish: Boolean read FFreeMicroThreadOnFinish
     
    8988
    9089
    91 function SystemTicks: Int64;
    92 {$IFDEF Windows}
    93 begin
    94   QueryPerformanceCounter(Result);
    95   //Result := Int64(TimeStampToMSecs(DateTimeToTimeStamp(Now)) * 1000) // an alternative Win32 timebase
    96 {$ELSE}
    97 var t : timeval;
    98 begin
    99   fpgettimeofday(@t,nil);
    100    // Build a 64 bit microsecond tick from the seconds and microsecond longints
    101   Result := (Int64(t.tv_sec) * 1000000) + t.tv_usec;
    102 {$ENDIF}
    103 end;
    104 
    105 
    10690{ TMicroThread }
    10791
     
    11397procedure TMicroThread.Sleep(Duration: TDateTime);
    11498begin
    115   FWakeUpTime := Now + Duration;
     99  FWakeUpTime := Scheduler.GetNow + Duration;
    116100  State := tsSleeping;
    117101  Yield;
     
    124108  FBasePointer := FStack + FStackSize;
    125109  FStackPointer := FBasePointer - 20;
     110  FExecutionTime := 0;
    126111end;
    127112
     
    132117end;
    133118
     119
    134120{ TMicroThreadScheduler }
     121
     122function TMicroThreadScheduler.GetNow: TDateTime;
     123var
     124  {$IFDEF Linux}T: TimeVal;{$ENDIF}
     125  {$IFDEF Windows}TimerValue: Int64;{$ENDIF}
     126begin
     127  {$IFDEF Windows}
     128  QueryPerformanceCounter(TimerValue);
     129  //Result := Int64(TimeStampToMSecs(DateTimeToTimeStamp(Now)) * 1000) // an alternative Win32 timebase
     130  Result := TimerValue / FFrequency;
     131  {$ENDIF}
     132  {$IFDEF Linux}
     133  fpgettimeofday(@t, nil);
     134   // Build a 64 bit microsecond tick from the seconds and microsecond longints
     135  Result := (Int64(t.tv_sec) * 1000000) + t.tv_usec;
     136  {$ENDIF}
     137
     138  Result := (Trunc(Now / OneSecond) + Frac(Result)) * OneSecond;
     139end;
    135140
    136141function TMicroThreadScheduler.Add(Name: string; Method: TStartEvent
     
    154159  ThreadPool := TThreadPool.Create;
    155160  FFreeMicroThreadOnFinish := True;
     161  {$IFDEF Windows}
     162  QueryPerformanceFrequency(FFrequency);
     163  {$ENDIF}
     164  RoundRobinIndex := -1;
    156165end;
    157166
     
    164173end;
    165174
    166 procedure TMicroThreadScheduler.Start;
    167 begin
    168   RoundRobinIndex := -1;
     175function TMicroThreadScheduler.Execute(Count: Integer): Integer;
     176begin
     177  FExecuteCount := Count;
     178  FExecutedCount := 0;
    169179  Yield(nil);
     180  Result := FExecutedCount;
    170181end;
    171182
     
    177188var
    178189  I: Integer;
    179 begin
     190  Time: TDateTime;
     191begin
     192  Time := GetNow;
    180193  if Assigned(MicroThread) then begin
    181     MicroThread.FExecutionEndTime := Now;
     194    MicroThread.FExecutionEndTime := Time;
    182195    MicroThread.FExecutionTime := MicroThread.FExecutionTime +
    183196      (MicroThread.FExecutionEndTime - MicroThread.FExecutionStartTime);
     
    215228      // WakeUp sleeping threads
    216229      if (TMicroThread(MicroThreads[RoundRobinIndex]).State = tsSleeping) and
    217         (TMicroThread(MicroThreads[RoundRobinIndex]).FWakeupTime < Now) then
     230        (TMicroThread(MicroThreads[RoundRobinIndex]).FWakeupTime < Time) then
    218231          TMicroThread(MicroThreads[RoundRobinIndex]).State := tsWaiting else
    219232      begin
     
    232245  end;
    233246
    234   if Assigned(FSelected) then begin
     247  if Assigned(FSelected) and (FExecutedCount < FExecuteCount) then begin
     248    Inc(FExecutedCount);
    235249    asm
    236250      // Store scheduler stack
     
    243257    if FSelected.State = tsReady then begin
    244258      FSelected.State := tsRunning;
    245       FSelected.FExecutionStartTime := Now;
     259      FSelected.FExecutionStartTime := Time;
    246260      FTempPointer := FSelected.FStackPointer;
    247261      asm
     
    269283        mov ebp, edx
    270284      end;
     285      FSelected.FExecutionEndTime := Time;
     286      FSelected.FExecutionTime := FSelected.FExecutionTime +
     287       (FSelected.FExecutionEndTime - FSelected.FExecutionStartTime);
    271288      if FFreeMicroThreadOnFinish then begin
    272289        // Microthread is finished, remove it from queue
     
    282299      // Execute selected thread
    283300      FSelected.State := tsRunning;
    284       FSelected.FExecutionStartTime := Now;
     301      FSelected.FExecutionStartTime := Time;
    285302      FTempPointer := FSelected.FStackPointer;
    286303      asm
Note: See TracChangeset for help on using the changeset viewer.