Показать сообщение отдельно
Старый 10.11.2011, 14:52   #95
Greymem
Нуждающийся
 
Регистрация: 31.05.2010
Сообщений: 63
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

Вот накатал код, относительно по структуре похожий на мой

При длительной симуляции обязательно произойдёт ошибко.

Как обработать это всё попыткой? Так как главный цикл не знает какое действие выполняется прямо сейчас в фоне и наоборот.

Типа получилось удалить - ок, не получилось то просто 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
Всё работает без ошибок. В моём коде - нет. =( Пока не разобрался почему.

Но обработчик попытки мне всё равно нужен
(Offline)
 
Ответить с цитированием