forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   BlitzMax (http://forum.boolean.name/forumdisplay.php?f=104)
-   -   Вопрос-Ответ (для новичков BlitzMax) (http://forum.boolean.name/showthread.php?t=13756)

Greymem 09.11.2011 14:48

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Цитата:

Сообщение от MoKa (Сообщение 209014)

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

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

Local Image:TImage;
Try
DrawImage(Image, 0, 0, 0) ;
Catch ex:Object
Print ex.ToString()
End Try

Greymem 10.11.2011 12:08

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
up up up

SBJoker 10.11.2011 13:27

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
ну что тут можно посоветовать.. тебе точно многопоточное необходимо?
*Для справки, ты же вкурсе что разруливать потоки нужно самому да? Простое включение многопоточности не сделает приложение таковым.

Greymem 10.11.2011 14:21

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Цитата:

Сообщение от SBJoker (Сообщение 209144)
ну что тут можно посоветовать.. тебе точно многопоточное необходимо?
*Для справки, ты же вкурсе что разруливать потоки нужно самому да? Простое включение многопоточности не сделает приложение таковым.

Да я в курсе.
У меня есть основной игровой цикл
И задача в фоне которая создает объект для обработки в главном цикле.

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

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

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

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

Ибо ошибка EXCEPTION_ACCESS_VIOLATION

Greymem 10.11.2011 14:52

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

Но обработчик попытки мне всё равно нужен

Randomize 10.11.2011 16:22

Ответ: Вопрос-Ответ (для новичков 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

Тоже вполне работает.

Greymem 11.11.2011 09:20

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
2 Randomize
Спасибо за поправку, но не придирайтесь пожалуйста к мелким ошибкам, разумеется в
Код:

Function Add(X:Int, I:Int, Text:String, Source:String = " ")
должен быть Y вместо I

Код:

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

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


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

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

Вообщем доразобрался. Всем спасибо

Greymem 11.11.2011 09:38

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Новый вопрос

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

?

Randomize 11.11.2011 20:46

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Цитата:

Сообщение от Greymem (Сообщение 209232)
Новый вопрос

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

?

Нет, не целесообразно. Сам TImage является указателем на загруженное изображение/пиксмапу.

JeanWinters 13.11.2011 18:49

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Где можно скачать новую версию blitzmax ?

SBJoker 13.11.2011 21:59

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Ты это серьёзно?
http://forum.boolean.name/showthread.php?t=15661

Greymem 22.11.2011 07:44

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

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

Код:

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

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


RunObj(ObjTest) ;


baton4ik 22.11.2011 10:56

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
А ты посмотри как CreateThread() сделан:
Код:

Function Create:TThread( entry:Object( data:Object),data:Object )

Greymem 22.11.2011 12:52

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Цитата:

Сообщение от baton4ik (Сообщение 210612)
А ты посмотри как CreateThread() сделан:
Код:

Function Create:TThread( entry:Object( data:Object),data:Object )

Спс, Кэп.
Это я уже посмотрел

Теперь как вызвать этот самый entry ?

Greymem 22.11.2011 13:10

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Сижу, читаю. Неужели всё придется делать через EVENT'ы и HOOK'и ?


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot