Вот накатал код, относительно по структуре похожий на мой
При длительной симуляции обязательно произойдёт ошибко.
Как обработать это всё попыткой? Так как главный цикл не знает какое действие выполняется прямо сейчас в фоне и наоборот.
Типа получилось удалить - ок, не получилось то просто PRINT чегонибудь Но чтобы прога не останавливалась.
Надеюсь я понятно выражаюсь, и вы сможете мне помочь. Спасибо заранее.
Type TCustomType
Field X:Int;
Field Y:Int;
Field Text:String;
Function Add(X:Int, I:Int, Text:String, Source:String = " ")
Local NewData:TCustomType = New TCustomType;
NewData.X = X;
NewData.Y = Y;
NewData.Text = Text;
ObjList.AddLast(NewData) ;
Print(String(MilliSecs()) + Source + X + " " + Y + Text) ;
End Function
Method Destroy()
ObjList.Remove(Self) ;
X = Null;
Y = Null;
Text = Null;
GCCollect;
End Method
End Type
Function AddOrDestroy:Object(Obj:Object = Null)
Local LObj:TCustomType;
SeedRnd(MilliSecs() / Rand(1, 20)) ;
TCustomType.Add(Rand(1, 200), Rand(1, 200), "t " + String(Rand(1, 200)), " Thread ") ;
Delay(Rand(5, 10)) ;
For LObj = EachIn ObjList
LObj.Destroy() ;
Next
SeedRnd(MilliSecs() / Rand(1, 15)) ;
'Delay(Rand(5, 10)) ;
End Function
Global ObjList:TList = New TList;
Global ObjGenerator:TThread = New TThread;
SeedRnd(MilliSecs()) ;
While Not KeyDown(KEY_ESCAPE)
Local LObj:TCustomType;
Local I:Int;
If Not ObjGenerator.Running() Then ObjGenerator = CreateThread(AddOrDestroy, Null)
For I = 1 To Rand(1, 15)
SeedRnd(MilliSecs() / Rand(1, 20)) ;
TCustomType.Add(Rand(1, 200), Rand(1, 200), "t " + String(Rand(1, 200))) ;
Next
For LObj = EachIn ObjList
LObj.Destroy() ;
Next
For LObj = EachIn ObjList
Print(LObj.X);
Next
Wend
Добавлено:
В этом примере при операциях с листом если вставить LockMutex,UnlockMutex
Всё работает без ошибок. В моём коде - нет. =( Пока не разобрался почему.
Но обработчик попытки мне всё равно нужен