November 28, 2020, 10:35:53 AM

Author Topic: [bmx] Simple OOP Database engine with Threaded loading *SVN Blitz Required* by DavidSimon [ 1+ years ago ]  (Read 611 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : Simple OOP Database engine with Threaded loading *SVN Blitz Required*
Author : DavidSimon
Posted : 1+ years ago

Description : Tested in my own game, which it was wrote for. Now my map editor boots up instantly, and the tiles just 'stream' in one by one.

In case you're wondering, it IS possible to load graphics in an external thread, you will just most likely have to use your own format. Because any DX/GL stuff most likely has to be done within the main thread. Not sure how you could call loadimage without that occuring. LoadPixMap perhaps?
 
Also included is a oop approach to threading, the athread and amutex classes.


Code :
Code: BlitzMax
  1. Type TZoneRecord Extends TDataRecord
  2.         Field mZone:TMapZone
  3.         Field mWorkZone:TMapZone
  4.        
  5.         Method New()
  6.                
  7.                 mDataType = "Zone"
  8.                
  9.         End Method
  10.  
  11.         Function CreateZoneRecord:TZoneRecord(z:TMapZone)
  12.                
  13.                 Local r:TZoneRecord = New TZoneRecord
  14.                         r.mZone = z
  15.                 Return r
  16.                
  17.         End Function
  18.        
  19.         Method SyncFrom()
  20.                
  21.                 mWorkZone = New TMapZone
  22.                 mWorkZone.mX = mZone.mX
  23.                 mWorkZone.mY = mZone.mY
  24.                 mworkZone.mZ = mZone.mZ
  25.                 mworkZone.mRadius = mZone.mRadius
  26.                 mWorkZone.Name = mZone.name
  27.         '       mworkLight.mGreen = mLight.mGreen
  28.         '       mWorkLight.mBlue = mLight.mBlue
  29.                
  30.         '       mWorkLight.mRange = mLight.mRange
  31.                        
  32.         End Method
  33.        
  34.         Method SyncTo()
  35.                 If mZone = Null
  36.                         mZone = TMapZone.CreateCircle("", 0, 0, 0, 0, Null)
  37.                 End If
  38.                 mZone.Name = mworkzone.Name
  39.                 mZone.mx = mworkZone.mx
  40.                 mZone.my = mworkZone.my
  41.                 mZone.mz = mworkZone.mz
  42.                
  43.                 mZone.mRadius = mworkZone.mRadius
  44.                
  45.         End Method
  46.        
  47.         Method WriteHeader()
  48.                
  49.                 mfile.WriteLine(mWorkZone.Name)
  50.                 mfile.WriteFloat(mWorkZone.mX)
  51.                 mfile.WriteFloat(mWorkZone.mY)
  52.                 mFile.WriteFloat(mWorkzone.mZ)
  53.                
  54.                 mFile.WriteFloat(mWorkZone.mRadius)
  55.                                
  56.         End Method
  57.        
  58.         Method ReadHeader()
  59.                
  60.                 Local name:String = mfile.ReadLine()
  61.                 Local lx:Float = mfile.ReadFloat()
  62.                 Local ly:Float = mfile.ReadFloat()
  63.                 Local lz:Float = mfile.ReadFloat()
  64.                
  65.                 Local lradius:Float = mfile.ReadFloat()
  66.                
  67.                 mWorkZone = TMapZone.CreateCircle(name, lx, ly, lz, lradius, Null)
  68.                                
  69.         End Method
  70.        
  71. End Type
  72.  
  73. Type TLightRecord Extends TDataRecord
  74.         Field mLight:TMapLight
  75.         Field mWorkLight:TMapLight
  76.        
  77.         Method New()
  78.                
  79.                 mDataType = "Light"
  80.                
  81.         End Method
  82.  
  83.         Function CreateLightRecord:TLightRecord(l:TMapLight)
  84.                
  85.                 Local r:TLightRecord = New TLightRecord
  86.                        
  87.                 r.mLight = l
  88.                
  89.                 Return r
  90.                
  91.         End Function
  92.        
  93.         Method SyncFrom()
  94.                
  95.                 mWorkLight = New TMapLight
  96.                 mWorkLight.mX = mLight.mX
  97.                 mWorkLight.mY = mLight.mY
  98.                 mworklight.mZ = mLight.mZ
  99.                
  100.                 mworkLight.mRed = mLight.mRed
  101.                 mworkLight.mGreen = mLight.mGreen
  102.                 mWorkLight.mBlue = mLight.mBlue
  103.                
  104.                 mWorkLight.mRange = mLight.mRange
  105.                        
  106.         End Method
  107.        
  108.         Method SyncTo()
  109.                 If mlight = Null
  110.                         mLight = TMapLight.Create(0, 0, 0, 0, 0, 0, 0, Null)
  111.                 End If
  112.                 mLight.mx = mworklight.mx
  113.                 mlight.my = mworklight.my
  114.                 mlight.mz = mworklight.mz
  115.                
  116.                 mlight.mRed = mworklight.mRed
  117.                 mlight.mGreen = mworklight.mGreen
  118.                 mLight.mBlue = mWorkLight.mBlue
  119.                
  120.                 mLight.mRange = mWorkLight.mRange
  121.                        
  122.         End Method
  123.        
  124.         Method WriteHeader()
  125.                
  126.                 mfile.WriteFloat(mWorkLight.mX)
  127.                 mfile.WriteFloat(mWorkLight.mY)
  128.                 mFile.WriteFloat(mWorkLight.mZ)
  129.                
  130.                 mFile.WriteFloat(mWorkLight.mRed)
  131.                 mFile.WriteFloat(Self.mWorkLight.mGreen)
  132.                 mFile.WriteFloat(Self.mWorkLight.mBlue)
  133.                
  134.                 mFile.WriteFloat(Self.mWorkLight.mRange)
  135.                
  136.                
  137.         End Method
  138.        
  139.         Method ReadHeader()
  140.                
  141.                 Local lx:Float = mfile.ReadFloat()
  142.                 Local ly:Float = mfile.ReadFloat()
  143.                 Local lz:Float = mfile.ReadFloat()
  144.                
  145.                 Local lr:Float = mfile.ReadFloat()
  146.                 Local lg:Float = mfile.ReadFloat()
  147.                 Local lb:Float = mfile.ReadFloat()
  148.                
  149.                 Local lrange:Float = mfile.ReadFloat()
  150.                
  151.                 mWorkLight = TMapLight.Create(lx, ly, lz, lr, lg, lb, lrange, Null)
  152.                  
  153.         End Method
  154.        
  155. End Type
  156.  
  157. Type TMapRecord Extends TDataRecord
  158.  
  159.         Field mMap:TMap
  160.         Field mWorkMap:TMap
  161.        
  162.         Method New()
  163.                 mDataType = "Map"
  164.         End Method
  165.        
  166.         Function CreateMapRecord:TMapRecord(m:TMap)
  167.                
  168.                 Local r:TMapRecord = New TMapRecord
  169.                
  170.                 r.mMap = m
  171.                
  172.                 Return r
  173.                
  174.         End Function
  175.  
  176.         Method SyncFrom()
  177.                
  178.                 mWorkMap = New TMap
  179.                 mWorkMap.mMapWidth = mMap.mMapWidth
  180.                 mWorkMap.mMapHeight = mmap.mMapHeight
  181.                 mworkmap.mMapDepth = mmap.mMapDepth
  182.                
  183.                 mworkmap.mTileWidth = mmap.mTileWidth
  184.                 mworkmap.mTileHeight = mmap.mTileHeight
  185.                
  186.                 mworkmap.mTile = New TTile[mWorkMap.mMapWidth, mWorkMap.mMapHeight, mWorkMap.mMapDepth]
  187.                 mworkmap.mDrawInfo = New TDrawInfo[mworkmap.mMapWidth, mworkmap.mMapHeight]
  188.                
  189.                 For Local x:Int = 0 Until mworkmap.mMapWidth
  190.                         For Local y:Int = 0 Until mworkmap.mMapHeight
  191.                                
  192.                                 mworkmap.mDrawInfo[x, y] = mMap.mDrawInfo[x, y]
  193.                                
  194.                                 For Local z:Int = 0 Until mworkmap.mMapDepth
  195.                                         mWorkMAp.mTile[x, y, z] = mMap.mTile[x, y, z]
  196.                                                
  197.                                 Next
  198.                         Next
  199.                 Next
  200.        
  201.         End Method
  202.        
  203.         Method SyncTo()
  204.                 If mMap = Null
  205.                         mMap = New TMap
  206.                 End If
  207.                 mMap.mMapWidth = mworkMap.mMapWidth
  208.                 mMap.mMapHeight = mworkmap.mMapHeight
  209.                 mmap.mMapDepth = mworkmap.mMapDepth
  210.                
  211.                 mmap.mTileWidth = mworkmap.mTileWidth
  212.                 mmap.mTileHeight = mworkmap.mTileHeight
  213.                
  214.                 mmap.mTile = New TTile[mWorkMap.mMapWidth, mWorkMap.mMapHeight, mWorkMap.mMapDepth]
  215.                 mmap.mDrawInfo = New TDrawInfo[mworkmap.mMapWidth, mworkmap.mMapHeight]
  216.                
  217.                 For Local x:Int = 0 Until mworkmap.mMapWidth
  218.                         For Local y:Int = 0 Until mworkmap.mMapHeight
  219.                                
  220.                                 mmap.mDrawInfo[x, y] = mworkMap.mDrawInfo[x, y]
  221.                                
  222.                                 For Local z:Int = 0 Until mworkmap.mMapDepth
  223.                                         mMAp.mTile[x, y, z] = mworkMap.mTile[x, y, z]
  224.                                 Next
  225.                        
  226.                         Next
  227.                 Next           
  228.                        
  229.         End Method
  230.        
  231.         Method WriteHeader()
  232.                
  233.                 mfile.WriteInt(mWorkMap.mMapWidth)
  234.                 mfile.WriteInt(mWorkMap.mMapHeight)
  235.                 mFile.WriteInt(mWorkMap.mMapDepth)
  236.                
  237.                 mFile.WriteInt(mWorkmap.mTileWidth)
  238.                 mFile.WriteInt(Self.mWorkMap.mTileWidth)
  239.                
  240.                 For Local x:Int = 0 Until mworkmap.mMapWidth
  241.                 For Local y:Int = 0 Until mworkmap.mMapHeight
  242.                         For Local z:Int = 0 Until mworkmap.mMapDepth
  243.                                 If mworkmap.mTile[x, y, z] <> Null
  244.                                         mFile.WriteByte(1)
  245.                                         mFile.WriteLine(mworkmap.mTile[x, y, z].dPath)
  246.                                         mFile.WriteLine(mworkmap.mTile[x, y, z].nPath)
  247.                                 Else
  248.                                         mFile.WriteByte(0)
  249.                                 EndIf
  250.                         Next
  251.                 Next
  252.                 Next
  253.                                
  254.                
  255.         End Method
  256.        
  257.         Method ReadHeader()
  258.                
  259.                 Local mw:Int = mfile.ReadInt()
  260.                 Local mh:Int = mfile.ReadInt()
  261.                 Local md:Int = mfile.ReadInt()
  262.                
  263.                 Local tw:Int = mfile.ReadInt()
  264.                 Local th:Int = mfile.ReadInt()
  265.                
  266.                 mworkMap = TMap.Create(mw, mh, md, tw, th)
  267.                
  268.                 Local tl:TList = CreateList()
  269.                                
  270.                 For Local x = 0 Until mw
  271.                         For Local y = 0 Until mh
  272.                                 For Local z = 0 Until md
  273.                                         Local it:Int = mfile.ReadByte()
  274.                                         If it
  275.                                                 Local t:TTile = New TTile
  276.                                                 t.dPath = mfile.ReadLine()
  277.                                                 t.nPath = mfile.ReadLine()
  278.                                                 mworkmap.mTile[x, y, z] = t
  279.                                         End If
  280.                                 Next
  281.                         Next
  282.                 Next
  283.                
  284.         End Method
  285.        
  286. End Type
  287.  
  288. Type TTextureRecord Extends TDataRecord
  289.  
  290.         Field mTexture:Texture
  291.  
  292.         Method New()
  293.        
  294.                 mDataType = "Texture"
  295.                
  296.         End Method
  297.        
  298.         Function CreateTextureRecord:TTextureRecord(tex:Texture)
  299.                
  300.                 Local r:TTextureRecord = New TTextureRecord
  301.                                
  302.                 r.mTexture = tex
  303.                 If r.mTexture.Path = ""
  304.                         Notify "Texture has no path. Aborting."
  305.                 EndIf
  306.                
  307.                                
  308.                 Return r
  309.        
  310.         End Function
  311.        
  312.         Method SyncFrom()
  313.                
  314.                 mBuf = mTexture.buf
  315.                 mSize = mtexture.Width * mTexture.Height * mTexture.depth
  316.                 mbufstream = CreateRamStream(mbuf, msize, True, True)
  317.                 InFile = False
  318.        
  319.         End Method
  320.        
  321.         Method SyncTo()
  322.                
  323.                 Local pa:String = mtexture.Path
  324.                 mTexture = Texture.FromBuf(mbuf, mtexture.Width, mtexture.Height, mtexture.depth)
  325.                 mtexture.Path = pa
  326.                 'mTexture.buf = mBuf
  327.                 'mTexture.Bind()
  328.                 'mTexture.Upload()
  329.                 'mTexture.Unbind()
  330.                        
  331.         End Method
  332.        
  333.         Method WriteHeader()
  334.                
  335.                 mfile.WriteInt(mTexture.Width)
  336.                 mFile.WriteInt(mTexture.Height)
  337.                 mFile.WriteInt(mTexture.depth)
  338.                 mFile.WriteLine(mTexture.Path)
  339.         End Method
  340.        
  341.         Method ReadHeader()
  342.                
  343.                 Local w:Int = mFile.ReadInt()
  344.                 Local H:Int = mFile.ReadInt()
  345.                 Local depth:Int = mFile.ReadInt()
  346.                 Local path:String = mfile.ReadLine()
  347.         '       If mtexture = Null
  348.                        
  349.                         mTexture = Texture.Blank(w, h, depth)
  350.                         mtexture.Path = path
  351.         '       Else
  352.                        
  353.         '               mtexture.Width = w
  354.         '               mtexture.Height = h
  355.         '               mtexture.depth = depth
  356.                
  357.         '       EndIf
  358.                
  359.         End Method
  360.  
  361. End Type
  362.        
  363. Type TDataRecord
  364.        
  365.         Field InMemory:Int, InFile:Int
  366.         Field Name:String
  367.         Field mDataType:String
  368.         Field mBuf:Byte Ptr
  369.         Field mSize:Int
  370.         Field mBufStream:TRamStream
  371.         Field mPath:String
  372.         Field mFile:TStream
  373.        
  374.         Method SyncFrom() Abstract
  375.        
  376.         Method SyncTo() Abstract
  377.                        
  378.        
  379.         Method WriteHeader() Abstract
  380.        
  381.         Method ReadHeader() Abstract
  382.        
  383.         Method CreateBuffer(size:Int)
  384.                
  385.                 If mbuf <> Null
  386.                         MemFree mbuf
  387.                 EndIf
  388.                 mbuf = MemAlloc(size)
  389.                 mbufstream = CreateRamStream(mbuf, msize, True, True)
  390.                 msize = size
  391.                                
  392.         End Method
  393.  
  394.         Method Open()
  395.                 If FileType(mPath) = 0
  396.                         mFile = WriteFile(mPath)
  397.                         If mFile = Null
  398.                                 Notify "Could not create file:" + mPath + " Aborting program."
  399.                         End If
  400.                         CloseFile mfile
  401.                 EndIf
  402.                 mFile = OpenFile(mPath)
  403.         End Method
  404.        
  405.        
  406.         Method Write()
  407.                
  408.                 Open()
  409.                
  410.                 mFile.Seek(0)
  411.                
  412.                 SyncFrom()
  413.                
  414.                 WriteHeader()
  415.                
  416.                
  417.                
  418.                 Local ed:Byte Ptr = MemAlloc(mSize * 2)
  419.                
  420.                 Local el:Int = mSize * 2
  421.                
  422.                 compress2(ed, el, mbuf, msize, 9)
  423.                
  424.                 mFile.WriteInt(mSize)
  425.                 mFile.WriteInt(el)
  426.                 mFile.Write(ed, el)
  427.                
  428.                 MemFree ed
  429.                
  430.                 Close()
  431.                
  432.                
  433.         End Method
  434.        
  435.         Field LoadThread:TLoadRecordThread
  436.        
  437.        
  438.         Method IsReady:Int()
  439.        
  440.        
  441.                 If LoadThread = Null
  442.                
  443.                         Return True
  444.                                                                
  445.                 EndIf
  446.                
  447.                 Local ret:Int = False
  448.                
  449.                 LoadThread.mMutex.Lock()
  450.                 ret = loadthread.mDone
  451.                 LoadThread.mMutex.Unlock()
  452.                
  453.                 Return ret
  454.        
  455.         End Method
  456.        
  457.         Field mThreadDoned = False
  458.        
  459.         Method ThreadDone()
  460.        
  461.                 If mThreadDoned = False
  462.                
  463.                         mThreadDoned = True
  464.                         SyncTo()
  465.                         LoadThread = Null
  466.                
  467.                 EndIf
  468.                
  469.         End Method
  470.                
  471.         Method Read()
  472.                        
  473.                 LoadThread = New TLoadRecordThread
  474.                 LoadThread.mRecord = Self
  475.                 LoadThread.run()
  476.                 Print "Started Load Thread. Item:"+name+" DataType:"+mDataType+" Size:"+mSize
  477.        
  478.         End Method
  479.        
  480.         Method Close()
  481.        
  482.                 CloseFile mFile
  483.        
  484.         End Method
  485.        
  486. End Type
  487.  
  488. Type TLoadRecordThread Extends AThread
  489.  
  490.         Field mRecord:TDataRecord
  491.         Field mDone:Int = False
  492.         Field mMutex:AMutex
  493.        
  494.         Method Init()
  495.        
  496.                 mMutex = New AMutex
  497.                 mDone = False
  498.        
  499.         End Method
  500.        
  501.        
  502.        
  503.         Method ThreadLogic:Object()
  504.        
  505.                 Print "Loading DataRecord assets. Item:"+mRecord.name+" DataType:"+mRecord.mDataType+" Size:"+mRecord.mSize
  506.                
  507.                 mRecord.Open()
  508.                
  509.                 Print "Open succesfull"
  510.                
  511.                 mRecord.mFile.Seek(0)
  512.                
  513.                 Print "Seek succesfull"
  514.                
  515.                 mRecord.ReadHeader()
  516.                
  517.                 Print "Read Header OK."
  518.                
  519.                 Local os:Int = mRecord.mfile.ReadInt()
  520.                 Local ds:Int = mRecord.mFile.ReadInt()
  521.                
  522.                 Print "Read Size OK."
  523.                
  524.                 Local cb:Byte Ptr = MemAlloc(ds)
  525.                
  526.                 Print "Allocated Memory OK."
  527.                
  528.                 mRecord.CreateBuffer(os)
  529.                
  530.                 Print "Create Internal Buffer OK."
  531.                
  532.                 mRecord.mfile.Read(cb, ds)
  533.                                
  534.                 Print "Read Record OK."
  535.                                
  536.                 uncompress(mRecord.mBuf, os, cb, ds)
  537.                
  538.                 Print "Uncompressed data into original form OK."
  539.                
  540.                 mRecord.mSize = os
  541.                
  542.                 Print "Set Size OK."
  543.                
  544.                 mRecord.close()
  545.                
  546.                 Print "Closed Record OK."
  547.                
  548.                 'mRecord.SyncTo()
  549.        
  550.                 Print "Synced Resource OK."
  551.        
  552.                 mMutex.Lock()
  553.                
  554.                 Print "Locked Mutex OK."
  555.                
  556.                 mDone = True
  557.                
  558.                 Print "Set External Variable OK."
  559.                
  560.                 mMutex.unlock()
  561.                        
  562.                 Print "DataRecord assets loaded. Item:"+mRecord.name+" DataType:"+mRecord.mDataType+" Size:"+mRecord.mSize
  563.  
  564.        
  565.         End Method
  566.        
  567.  
  568. End Type
  569.  
  570. Type TDatabase
  571.  
  572.         Field mName:String
  573.         Field mAuthor:String
  574.         Field mCopyright:String
  575.         Field mPath:String
  576.         Field mRecords:TList = CreateList()
  577.         Field mFile:TStream
  578.         Field mMainPath:String
  579.        
  580.         Method Finished()
  581.                
  582.                 Save()
  583.                        
  584.         End Method
  585.        
  586.         Function Create:TDatabase(name:String, path:String)
  587.                
  588.                 Local r:TDatabase = New TDatabase
  589.                
  590.                 r.mName = name
  591.                
  592.                 r.mAuthor = "Dreambreaker Software"
  593.                
  594.                 r.mCopyright = "(c)Dreambreaker Software 2008"
  595.                
  596.                 r.mPath = path
  597.                
  598.                 Local fp:String = Path + "DATA"
  599.                 If FileType(fp) = 0
  600.                         CreateDir(fp, True)
  601.                 End If
  602.                
  603.                 Local ind:String = path + ".wdb"
  604.                 r.mMainPath:String = ind
  605.                 Select FileType(ind)
  606.                         Case 1
  607.                                  r.SyncIndex()
  608.                 End Select
  609.                                                
  610.                 Return r
  611.                
  612.         End Function
  613.  
  614.         Method AddRecord(t:TDataRecord, name:String)
  615.                
  616.                 t.mPath = mPath + "DATA" + name
  617.                 t.InMemory = True
  618.                 t.InFile = False
  619.                 t.Name = name
  620.                 mRecords.addlast(t)
  621.                 WriteIndex()
  622.                 Save()
  623.                  
  624.         End Method
  625.        
  626.         Method Save()
  627.                
  628.                 For Local r:TDataRecord = EachIn mRecords
  629.                         If r.InFile = False
  630.                                 r.Write()
  631.                                 r.InFile = True
  632.                         End If
  633.                 Next
  634.        
  635.         End Method
  636.        
  637.         Method GetAllOfType:TList(name:String, LoadIfNotInMemory:Int = True)
  638.        
  639.                  name:String = name.ToLower()
  640.        
  641.                 Local ret:TList = CreateList()
  642.                
  643.                 For Local r:TDataRecord = EachIn mrecords
  644.        
  645.                         If r.mDataType.ToLower() = name.ToLower()
  646.                                
  647.                                 If LoadIfNotInMemory
  648.                                
  649.                                         If r.InMemory = False
  650.                                                 Local ms:Int = MilliSecs()
  651.                                                 r.read()
  652.                                                 r.InMemory = True
  653.                                                 Print "Loaded Record:" + r.Name + " in ms:" + (MilliSecs() - ms)
  654.                                                
  655.                                         End If
  656.                                
  657.                                 End If
  658.                                        
  659.                                 ret.AddLast(r)
  660.                         End If
  661.        
  662.                 Next
  663.                
  664.                 Return ret
  665.                
  666.         End Method
  667.        
  668.         Method FindRecord:TDataRecord(name:String, LoadIfNotInMemory:Int = True)
  669.                
  670.                 name = name.ToLower()
  671.                
  672.                 For Local r:TDataRecord = EachIn mRecords
  673.                        
  674.                         If r.Name.ToLower() = name
  675.                                 If r.InMemory = False And LoadIfNotInMemory = True And r.LoadThread = Null
  676.                                         r.Read()
  677.                                         r.InMemory = True
  678.                                 EndIf
  679.                                 Return r
  680.                         EndIf
  681.                                        
  682.                 Next
  683.                
  684.        
  685.                 Print "Record List"
  686.                
  687.                 For Local r:TDataRecord = EachIn mRecords
  688.                         Print "Record:" + r.Name
  689.                 Next
  690.                 Print "Fin"
  691.                
  692.                 Notify "Record Named:" + name + " was not found in db."
  693.                
  694.         End Method
  695.        
  696.         Method SyncIndex()
  697.  
  698.                 mRecords.Clear()
  699.        
  700.                 Open()
  701.                
  702.                 mFile.Seek(0)
  703.                
  704.                 Local i:Int = mFile.ReadInt()
  705.                
  706.                 While i > 0
  707.                        
  708.                        
  709.                        
  710.                         Local path:String = mfile.ReadLine()
  711.                         Local dtype:String = mFile.ReadLine()
  712.                         Local siz:Int = mFile.ReadInt()
  713.                         Local nam:String = mFile.ReadLine()
  714.                         Local d:TDataRecord
  715.                        
  716.                         Select dtype.ToLower()
  717.                                 Case "zone"
  718.                                         d = TDataRecord(New TZoneRecord)
  719.                                 Case "texture"
  720.                                         d = TDataRecord(New TTextureRecord)
  721.                                 Case "map"
  722.                                         d = TDataRecord(New TMapRecord)
  723.                                 Case "light"
  724.                                         d = TDataRecord(New TLightRecord)
  725.                                 Default
  726.                                         Notify "Unsupported Data Type."
  727.                         End Select
  728.                        
  729.                         d.mPath = path
  730.                         d.mDataType = dtype
  731.                         d.mSize = siz
  732.                         d.InMemory = False
  733.                         d.InFile = True
  734.                         d.Name = nam
  735.                         mRecords.AddLast(d)
  736.                         i:-1
  737.                 Wend
  738.                
  739.                 Close()
  740.                                
  741.         End Method
  742.        
  743.         Method WriteIndex()
  744.                
  745.                 Open()
  746.                
  747.                 mFile.Seek(0)
  748.                
  749.                 mFile.WriteInt(mRecords.Count())
  750.                
  751.                 For Local r:TDataRecord = EachIn mRecords
  752.                        
  753.                         mFile.WriteLine(r.mPath)
  754.                         mfile.WriteLine(r.mDataType)
  755.                         mFile.WriteInt(r.mSize)
  756.                         mFile.WriteLine(r.Name)
  757.                                                                
  758.                 Next
  759.                
  760.                 Close()
  761.        
  762.         End Method
  763.        
  764.         Method Open()
  765.                 If FileType(mMainPath) = 0
  766.                         mFile = WriteFile(mMainPath)
  767.                         CloseFile mFile
  768.                 End If
  769.                 mFile = OpenFile(mMainPath, True, True)
  770.                 If mFile = Null
  771.                         Notify "Could not open Database:" + mMainPath
  772.                         End
  773.                 End If
  774.         End Method
  775.  
  776.         Method Close()
  777.                
  778.                 mFile.Close()
  779.                        
  780.         End Method
  781.        
  782.         Method SyncFrom()
  783.                                
  784.        
  785.         End Method
  786.  
  787. End Type
  788. '
  789. '--[ A.B.E Threading Component ]--
  790. '
  791. '
  792. '-[
  793. '
  794. '
  795. 'Threads are objects that you are supposed to extend to utilize their functionality.
  796. '
  797. 'See the Examples/Threading test for an easy to follow example.
  798. '
  799. '-]
  800.  
  801. SuperStrict
  802.  
  803. Import pub.threads
  804. Import brl.linkedList
  805.  
  806. Type AMutex
  807.  
  808.         Field mHandle:Int
  809.        
  810.         Method New()
  811.        
  812.                 mHandle = CreateMutex()
  813.        
  814.         End Method
  815.        
  816.         Method Delete()
  817.        
  818.                 CloseMutex(mHandle)
  819.        
  820.         End Method
  821.        
  822.        
  823.        
  824.         Method Lock()
  825.        
  826.                 LockMutex(mHandle)
  827.                
  828.         End Method
  829.        
  830.         Method Unlock()
  831.        
  832.                 UnlockMutex(mHandle)
  833.                
  834.         End Method
  835.        
  836.        
  837.        
  838.  
  839. End Type
  840.  
  841.  
  842. Type AThread
  843.        
  844.         Field mHandle : Int
  845.        
  846.        
  847.         Method Init() Abstract
  848.        
  849.         Method New()
  850.                
  851.                 mHandle = 0
  852.                 WaitOnDelete = False    
  853.                
  854.                                
  855.         End Method
  856.        
  857.         Field WaitOnDelete:Int
  858.        
  859.         Method Delete()
  860.        
  861.                 If WaitOnDelete
  862.                         WaitFor()
  863.                 Else
  864.                         detach()
  865.                 EndIf
  866.                
  867.         End Method
  868.        
  869.        
  870.         Method Run()
  871.                
  872.                 If mhandle <>0
  873.                         Detach()
  874.                 EndIf
  875.                
  876.                 Init()
  877.                
  878.                 mHandle = CreateThread(RunThread_A,Object(Self))
  879.                
  880.         End Method
  881.        
  882.         Method WaitFor:Object()
  883.                 If mHandle = 0 Return Null
  884.                 Local ret:Object = WaitThread(mHandle)
  885.                 mHandle = 0
  886.                 Return ret
  887.                
  888.         End Method
  889.        
  890.        
  891.         Method Detach()
  892.                 If mhandle=0 Return
  893.                 DetachThread(mHandle)
  894.                 mHandle = 0
  895.         End Method
  896.        
  897.         Method ThreadLogic:Object() Abstract
  898.        
  899.        
  900. End Type
  901.  
  902.  
  903. Function RunThread_A:Object(thread:Object)
  904.  
  905.         Local t:AThread = AThread(thread)
  906.        
  907.         Return t.ThreadLogic()
  908.  
  909. End Function


Comments :


DavidSimon(Posted 1+ years ago)

 You'll have to comment out the example datarecord types. it just shows that to create a new type of record, you extend the base class and override a few methods.


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal