Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > BlitzMax

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

Это я тоже читал

Вот такая байда например работать не хочет при билде релиза.
В однопоточном Debug Mod работает. В многопоточном не работает.

Local Image:TImage;
Try
DrawImage(Image, 0, 0, 0) ;
Catch ex:Object
Print ex.ToString()
End Try
(Offline)
 
Ответить с цитированием
Старый 10.11.2011, 12:08   #92
Greymem
Нуждающийся
 
Регистрация: 31.05.2010
Сообщений: 63
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

up up up
(Offline)
 
Ответить с цитированием
Старый 10.11.2011, 13:27   #93
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

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

Сообщение от SBJoker Посмотреть сообщение
ну что тут можно посоветовать.. тебе точно многопоточное необходимо?
*Для справки, ты же вкурсе что разруливать потоки нужно самому да? Простое включение многопоточности не сделает приложение таковым.
Да я в курсе.
У меня есть основной игровой цикл
И задача в фоне которая создает объект для обработки в главном цикле.

Долго объяснять.

Вот всё бы нормально... до тех пор пока главный цикл не обратиться к "недосозданному" в фоне объекту. Или когда главный цикл попытается удалить этот объект

Я даже при создании и удалении блокирую один и тот-же мутекс. Всё равно где-то ошибка.

Теперь мне как обработать попытку в главном цикле и как обработать попытку в фоне?

Ибо ошибка EXCEPTION_ACCESS_VIOLATION
(Offline)
 
Ответить с цитированием
Старый 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)
 
Ответить с цитированием
Старый 10.11.2011, 16:22   #96
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,355
Написано 2,471 полезных сообщений
(для 6,852 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

По поводу семпла бегло могу сказать сразу:


Function Add(X:Int, I:Int, Text:String, Source:String = " ")
	Local NewData:TCustomType = New TCustomType;
		NewData.X = X;
		NewData.Y = Y;
Параметр I в конструкторе ошибочен - внутри конструктора Y остаётся вновь созданной нетронутой переменной с нулём.

While Not KeyDown(KEY_ESCAPE)
Local LObj:TCustomType;
Local I:Int;
Опрашивать клавиатуру нечем. Окна то нет.

	Method Destroy()
		ObjList.Remove(Self) ;
		X = Null;
		Y = Null;
		Text = Null;
		GCCollect;
	End Method
Я понимаю стремление всё контролировать, но обнулять переменные не надо. Это сделает Garbage collector сам. Всё кроме ObjList.Remove(Self) и GCCollect можно убрать из деструктора.


Написал семпл:
SuperStrict
Framework brl.basic
Import brl.glmax2d
Import brl.random
Import brl.threads

Type TTest
	Field x:Float, y:Float, z:Float
EndType

Function MySexyThread:Object(obj:Object)
		Local tst:TTest
		Try
			tst.x = 7
			tst.y = 8
		Catch e:Object
			Print "Gotcha! " + e.ToString()
		EndTry
EndFunction


Global SexyThread:TThread = New TThread

SeedRnd(MilliSecs())


Local endtime:Int = MilliSecs() + (1000 * 60)
While (MilliSecs() < endtime)
	If Not SexyThread.Running() Then SexyThread = CreateThread(MySexyThread, Null)
	Delay(1)
Wend
Работает как положено. На протяжении минуты плюёт экскепты.
Твой код с указанными выше правками тоже работает.

SuperStrict
Framework brl.basic
Import brl.glmax2d
Import brl.random
Import brl.threads

Local img:TImage

Try
	DrawImage(img, 10, 10)
Catch e:Object
	Print "Wft? " + e.ToString()
End Try
Тоже вполне работает.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Greymem (11.11.2011)
Старый 11.11.2011, 09:20   #97
Greymem
Нуждающийся
 
Регистрация: 31.05.2010
Сообщений: 63
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

2 Randomize
Спасибо за поправку, но не придирайтесь пожалуйста к мелким ошибкам, разумеется в
Function Add(X:Int, I:Int, Text:String, Source:String = " ")
должен быть Y вместо I

While Not KeyDown(KEY_ESCAPE)
Хотел графику сделать, но потом передумал.

Ошибка вызванная операциями в основном и фоновом потоке никак не связана с моими маленькими погрешностями.


Попытка, Исключения указанные тобой при во втором примере работают только в DebugMod и в однопоточном режиме.

За первый спасибо. Работает =)))
Странно, но у меня тоже самое не пахало =)

Вообщем доразобрался. Всем спасибо
(Offline)
 
Ответить с цитированием
Старый 11.11.2011, 09:38   #98
Greymem
Нуждающийся
 
Регистрация: 31.05.2010
Сообщений: 63
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

Новый вопрос

Целесообразно ли использовать в каждом графическом объекте TLink на Image вместо самого TImage если в системе много объектов с одинаковым изображением?

?
(Offline)
 
Ответить с цитированием
Старый 11.11.2011, 20:46   #99
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,355
Написано 2,471 полезных сообщений
(для 6,852 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

Сообщение от Greymem Посмотреть сообщение
Новый вопрос

Целесообразно ли использовать в каждом графическом объекте TLink на Image вместо самого TImage если в системе много объектов с одинаковым изображением?

?
Нет, не целесообразно. Сам TImage является указателем на загруженное изображение/пиксмапу.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Старый 13.11.2011, 18:49   #100
JeanWinters
Знающий
 
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений
(для 51 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

Где можно скачать новую версию blitzmax ?
(Offline)
 
Ответить с цитированием
Старый 13.11.2011, 21:59   #101
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

Ты это серьёзно?
http://forum.boolean.name/showthread.php?t=15661
__________________
(Offline)
 
Ответить с цитированием
Старый 22.11.2011, 07:44   #102
Greymem
Нуждающийся
 
Регистрация: 31.05.2010
Сообщений: 63
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

Подскажите пожалуйста, как вызывать из функции другую функцию, если название второй было передано в первой.
К примеру, как это делает функция CreateThread() ?

Исправьте плиз код, чтобы из функции RunObj можно было вызвать любую другую, которая идет в параметре к данной функции.

Function ObjTest:Object()
	Print("Hello") ;
End Function

Function RunObj(ObjName:Object)
?????
End Function


RunObj(ObjTest) ;
__________________
Мозги... у них есть метод "Storm"
(Offline)
 
Ответить с цитированием
Старый 22.11.2011, 10:56   #103
baton4ik
Дэвелопер
 
Аватар для baton4ik
 
Регистрация: 21.11.2009
Адрес: Киев
Сообщений: 1,699
Написано 657 полезных сообщений
(для 1,962 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

А ты посмотри как CreateThread() сделан:
Function Create:TThread( entry:Object( data:Object),data:Object )
(Offline)
 
Ответить с цитированием
Старый 22.11.2011, 12:52   #104
Greymem
Нуждающийся
 
Регистрация: 31.05.2010
Сообщений: 63
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

Сообщение от baton4ik Посмотреть сообщение
А ты посмотри как CreateThread() сделан:
Function Create:TThread( entry:Object( data:Object),data:Object )
Спс, Кэп.
Это я уже посмотрел

Теперь как вызвать этот самый entry ?
__________________
Мозги... у них есть метод "Storm"
(Offline)
 
Ответить с цитированием
Старый 22.11.2011, 13:10   #105
Greymem
Нуждающийся
 
Регистрация: 31.05.2010
Сообщений: 63
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

Сижу, читаю. Неужели всё придется делать через EVENT'ы и HOOK'и ?
__________________
Мозги... у них есть метод "Storm"
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 05:39.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com