forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Библиотеки (http://forum.boolean.name/forumdisplay.php?f=28)
-   -   Использование FastPointer (http://forum.boolean.name/showthread.php?t=16612)

Halk-DS 06.04.2012 19:23

Использование FastPointer
 
Проблема заключается в моем представлении о многопоточности. Если судить с примера звука в блице. Команда EmitSound(S,E) издает звук, и в не зависимости от того какой он длинны (3сек, 15сек и >) вся другая логика продолжается. То есть я делаю вывод что обработка звука пошла в другой независимый поток.
Я скачал FastPointer библиотеку и разбирал примеры лежащие в ней. Хотел б рассмотреть конкретный случай с вызовом функций:
Код:

MyFunctionFirstPointer = FunctionPointer();Это как я понимаю процесс
;привязки функции к переменной, которую мы сможем в любой момент вызвать.


        Goto skip
        MyFunctionFirst(); Тогда зачем это?
        .skip
       
;Было б проще понять следующий метод описывания переменной для привязки:
;MyFunctionFirstPointer = FunctionPointer(MyFunctionFirst())[
; Ну да тут ладно. В примере с Массивами это выглядит не так уж непонятно.

MyFunctionSecondPointer = FunctionPointer(); дубль два
        Goto skip1
        MyFunctionSecond(0)
        .skip1



;Вот это место как я понял должно мне сообщить что то очень важное...
;Но погуглив я понимаю только что Hex() переводит число в 16численную систему
;А саму суть не уловил.
Print "First function pointer: $"+Hex(MyFunctionFirstPointer)
Print "Second function pointer: $"+Hex(MyFunctionSecondPointer)



;И главное. Эти функции вызвались, и в моем понимании они должны пойти
;В другой независимый поток как в случае с EmitSound(S,E)
CallFunction (MyFunctionFirstPointer)
CallFunctionVarInt (MyFunctionSecondPointer,12345)





; Но немного отредактировав функции я вижу что вторая функция перед
;вступлением в дело ждет исполнения 1-й функции. Так хде ш тут многопоточность?
Function MyFunctionFirst ()
        Print "MyFunctionFirst called!"
        For j=1 To 100
        Print J
        Delay 10
        Next
End Function


Function MyFunctionSecond (variable)
        Print "MyFunctionSecond called with variable: "+Str(variable)
        For J=-100 To -1
        Print J
        Delay 10
        Next
End Function

Как я понимаю в моем случае блиц должен приблизительно по очереди выводить на экран 1, -100, 2, -99, 3, -98 и т.д.
Помогите пожалуйста понять, как в принципе устроена многопоточность и в частности эта библиотека?
Приветствуется посылания на хорошие статейки...:)

Платон Александрович 06.04.2012 22:01

Ответ: Использование FastPointer
 
Цитата:

Сообщение от Halk-DS (Сообщение 224781)
Код:

        Goto skip
        MyFunctionFirst(); Тогда зачем это?
        .skip


Вычисление адреса функции с помощью этой библиотеки сделано "хаком", по сути дизассемблируется вызов функции и достается адрес. Чтобы функция при этом не выполнилась, ее вызов пропускается с помощью Goto (но код вызова при этом остается, из которого и достается адрес выше функцией FunctionPointer)

Цитата:

Сообщение от Halk-DS (Сообщение 224781)
Код:

;Вот это место как я понял должно мне сообщить что то очень важное...
;Но погуглив я понимаю только что Hex() переводит число в 16численную систему
;А саму суть не уловил.
Print "First function pointer: $"+Hex(MyFunctionFirstPointer)
Print "Second function pointer: $"+Hex(MyFunctionSecondPointer)


КЭП сообщает что тут печатаются адреса полученных функций

Цитата:

Сообщение от Halk-DS (Сообщение 224781)
Код:

Так хде ш тут многопоточность?

С чего вдруг тут должна быть многопоточность? Ты всего-лишь получил адеса функций, само выполнение их как было в главном потоке, так и осталось. Адреса же полученных функций ты можешь передать куда-нить, где по ним будут эти функции вызываться, например уже в другую библиотеку, которая будет создавать отдельные потоки, внутри которых и будут вызываться твои функции.
Цитата:

Сообщение от Halk-DS (Сообщение 224781)
Помогите пожалуйста понять, как в принципе устроена многопоточность и в частности эта библиотека?
Приветствуется посылания на хорошие статейки...:)

В гугле забанили?:)
Если кратко
Есть процесс, у него есть основной поток, и может быть несколько побочных потоков.
Проще говоря каждый поток представляет собой функцию.
Потоками рулит операционная система.
Можно насильно указать потоку на каком процессоре ему выполняться, иначе это решает система и ее планировщик.
Планировщик отдает каждому процессу и потоку определенное кол-во процессорного времени, понемногу продвигая каждый из потоков\процессов (виртуальная мультипоточность).
Т.к. потоки работают параллельно, общение между ними (чтение\запись данных) нужно синхронизировать, для этого в системе существуют несколько вещей (критические секции, мутексы, семафоры, атомарные операторы и т.п.)
В случае с блицем тебе нужно передать полученый адрес в функцию создания потока (в винде это CreateThread, в этой библиотеке кстати так-же называется ), так-же нужно позаботиться о том, чтобы передать в поток определенные данные (в той же системный CreateThread можно указать адрес блока памяти).

Вообще в fastpointer есть два примера работы с потоками - Example_ThreadUse и Example_ThreadUse2, смотри их.

Halk-DS 07.04.2012 01:17

Ответ: Использование FastPointer
 
Цитата:

Сообщение от Платон Александрович (Сообщение 224793)
Вообще в fastpointer есть два примера работы с потоками - Example_ThreadUse и Example_ThreadUse2, смотри их.

Это решило почти все вопросы и проблемы :)
Просто сам не додумался до конца досмотреть.


Цитата:

Сообщение от Платон Александрович (Сообщение 224793)
КЭП сообщает что тут печатаются адреса полученных функций

Ну в принципе это было настолько очевидно, что оно меня запутало :-D


Цитата:

Сообщение от Платон Александрович (Сообщение 224793)
В гугле забанили?:)

Просто мне нужна была инфа про многопоточность в fastpointer. Ну а про многопоточность в общем можно и погуглить :)

В общем сенкс. :super:

Halk-DS 09.04.2012 23:53

Ответ: Использование FastPointer
 
На практике возникла проблема. Может кто сможет помочь, у меня во второй поток запущена функция вида:

Код:

Function UpdChunks()
  delay 1000
  For to - перебираем нужные чанки.
      If Chunk(x,y)=0 - если чанк в поле зрения и его не существует то:
        В этом месте создается меш, я делаю сразу на него ХайдЕнтити и в конце алгоритма, когда меш готов открываю его для рендера.
      EndIf
  Next
EndFunction

Результат странный. Как будто постройка чанка делается только на 1-2% из 100 и прерывается. Вот скрин:


(Эти кусочки - это места где начинает строится чанк, но до конца как видно дело не доходит...)

Кто нибудь уже пользовался библиотекой? Она нормальная? Или это я что то не то делаю?

Платон Александрович 10.04.2012 16:10

Ответ: Использование FastPointer
 
Цитата:

Сообщение от Halk-DS (Сообщение 225029)
На практике возникла проблема. Может кто сможет помочь, у меня во второй поток запущена функция вида:

Код:

Function UpdChunks()
  delay 1000
  For to - перебираем нужные чанки.
      If Chunk(x,y)=0 - если чанк в поле зрения и его не существует то:
        В этом месте создается меш, я делаю сразу на него ХайдЕнтити и в конце алгоритма, когда меш готов открываю его для рендера.
      EndIf
  Next
EndFunction

Результат странный. Как будто постройка чанка делается только на 1-2% из 100 и прерывается.

Кто нибудь уже пользовался библиотекой? Она нормальная? Или это я что то не то делаю?

У тебя поток, после прохода по циклу for, завершается (происходит выход из функции). Чтобы он работал постоянно нужно еще один внешний цикл.
А вообще забудь про мультипоточность в блице для чего-то кроме обычных программ, нет гарантии что 3д\2д будет корректно работать в разных потоках. На твоем-же примере:
Цитата:

Сообщение от Halk-DS (Сообщение 225029)
В этом месте создается меш, я делаю сразу на него ХайдЕнтити и в конце алгоритма, когда меш готов открываю его для рендера.

Когда только ты создал меш, он УЖЕ находится в списке рендерера, который в основном потоке УЖЕ имеет к нему доступ, и из-за асинхронности работы этих потоков ты просто рано или поздно схватишь MAV. Все эти библиотеки - костыли и хаки, и работать как положено они не будут.
Ты просто выбрал не тот инструмент.

Halk-DS 10.04.2012 19:56

Ответ: Использование FastPointer
 
Сенкс. Понял...

LLI.T.A.L.K.E.R. 02.09.2012 23:15

Ответ: Использование FastPointer
 
Использовал FAST Pointer Thread чтобы RakNET был не зависим от рендера Blitz3D - результат положительный.
(а то до этого из 200 передач на сервер передавались 150, и обратно на клиент 3 штуки)
а теперь при нажатии клавиши мне инфа передаётся сразу туда-сюда.
сервер на blitzmax, клиент blitz3d.


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

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