{{notification.text}}

MirGames

09.05.07 16:16
0
Народ - дайте пожалуйста пример работы с потоками для консольного приложения средствами WinApi.
Например я использую CreateThread.
---------------------------------------------------------------------------------------------------------------------------
Никогда не сталкивался с многопоточными приложениями, а тут понадобилось
в консольном приложении средствами winapi реализовать многопоточность.
Возможно ли это сделать без Classes??? Например CreateThread работает и без него.
Мне нужно чтобы 2 процесса исполнялись параллельно.
В частности обсчет и обрисовка в игре. Мне нужно пока происходит обрисовка
чтобы не останавливался обсчет.
Допусти есть процедуры process и draw.

h1:=CreateThread(nil,0,@process,nil,0,th1);
h2:=CreateThread(nil,0,@draw,nil,0,th2);

А дальше что - как организовать их работу???
---------------------------------------------------------------------------------------------------------------------------
А цикл обработки событий такой:
begin

if (PeekMessage(msg, 0, 0, 0, PM_REMOVE)) then
begin
if Msg.message=WM_QUIT then Done:=TRUE;
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
---------------------------------------------------------------------------------------------------------------------------
В VCL приложение после использования этой комманды сразу потоки идут параллельно.
А как их в консоли правильно использовать???

PS: возможно что-то не так сформулировал - но проблема вот такая!!! :(
Отредактировано: 09.05.07 16:17
#2
09.05.07 17:25
0
Опыта у меня немного... В этом вся проблема...
Спасибо, буду разбирать!!!
#3
mov, просто mov
10.05.07 13:53
0
zephyr
не мог написать в созданную уже тему ;)
#4
10.05.07 23:51
0
Народ выручайте!!!
Мне нужно знать как в потоке сделать задержку чтобы получилось нужное
мне число обработок процедуры.
-----------------------------------------------------------------------------------------
Цитата из Дигле
Затем мы должны указать скорость таймера или сколько раз в секунду будет вызываться процедура „Process“.
SetGameProcessInterval(25);
25 – это интервал в миллисекундах, т.е. процедура обсчета будет вызываться 40 раз в секунду. Процедура же отрисовки („Draw“) вызывается так часто, как позволяет железо.
-------------------------------------------------------------------------------------------
Мне нужно тоже самое только средствами winapi.
Обсчет я выделяю в отдельный поток используя CreateThread();
-------------------------------------------------------------------------------------
Как можно сделать задержку??? В миллисекундах???
Например я знаю что процедура обсчета за секунду у меня
происходит 1 миллион раз а мне нужна только 1 тысяча.
Как грамотно сделать задержку???

MegaI2
Проглядел!!! :)
#5
mov, просто mov
11.05.07 00:23
0
zephyr
либо реализуй таймер внутри патока
либо приостанавлтвай паток
либо поставь потоку низкий приоритет

ИМХО :)
#6
11.05.07 00:45
0
мне нужна только 1 тысяча
Чего то не выходит у меня таймер риализовать.
Скачками все как то получается.
#7
11.05.07 03:11
0
а не легче ли делать это всё в одном таймере но сделать вот так
var
OldProcessTime : Integer; -гденебудь в верху

.....

if OldProcessTime< gettickcount then
begin
process;
OldProcessTime:= gettickcount+25 (в милисекундах)
end;

.....
draw

и всё ?
#8
mov, просто mov
11.05.07 12:42
0
zephyr
Цитата
f OldProcessTime< gettickcount then
begin
process;
OldProcessTime:= gettickcount+25 (в милисекундах)
end;

вот те таймер
Валентин
хех при каждом прощёте буит теряться время рендеринга ;\)
тоесть фпс у тя буит скакать \:\) просчот сложный - фпс меньше
но при мультпаточности при сложных расчётах это буит посглаженней, скачков не буит
#9
11.05.07 13:21
0
MegaI2
Ага и картинку ты будиш видить одну и туже \:\)

Не мне лучше каждый кадр видить разные картинки чем одно и тоже....
#10
mov, просто mov
11.05.07 17:33
0
Валентин
чёт ты не так понял два патока работают вместе ;)
картинка обновляеться с нужным интервалом
а если просчёт будет стоять перед рендерингом то фпс будет скакать непадеццки
вот представь у тя простой рендеринг и сложные подсчёты.
ты будеш терять больше фпс при одном потоке нежели чем при двух :) а на двуядерном ваще кайф :)
Отредактировано: 11.05.07 17:34
#11
11.05.07 17:58
0
MegaI2
это я всё понимаю.
но чтото я ниге невидал лёгкий рендер и сложные расчёты :)
(не стичтая софтверных.. где они используются для качества)
#12
mov, просто mov
11.05.07 18:04
0
Валентин
и даж при сложном рендере и расчётах буит рулит мультипаточность :)
#13
аксакал
11.05.07 22:46
0
MegaI2
Причём иногда так рулит, что команда программистов не в состоянии управлять этим крейсером )
ИМХО лишняя головная боль, рендер всё равно на GPU исполняется! :P
Отредактировано: 11.05.07 22:46
#14
mov, просто mov
11.05.07 23:41
0
XProger
если при одном потоке:
Process
Draw

допустим процесс занимает 50мс а отрисовка 25мс, тоесть рендер каждый раз задерживаеться на 50мс
а при мультпаточности рендер не будет задерживаться вплотную до 50мс эта цифра будет поменьше
всётаки два потока и паралельна пашут, а ещё в двуядерных буит рулить ^_^

но тут правда гемор из-за мультпаточности разделение ресурсов и пр :wacko:
#15
11.05.07 23:58
0
MegaI2
Как не крути, но даже HT на пентиуме не будет тебе рендер и Process выполнять паралельно на одном кристалике :)
#16
mov, просто mov
12.05.07 01:45
0
Andru
хех, формально это паралельность, а так это вытесняющая многозадачность :)
любые два процесса не могут быть выполенны адновременно.
Цитата
рендер и Process выполнять паралельно на одном кристалике

хех кода всё в одной проке всё тупо стопориться ;)
а кода в потоках - вытесняющаяя многозадачность :)
#17
12.05.07 03:25
0
Спасибо откликнувшимся.
Я во всем разобрался - скачки были не из-за неправильной работы
потока. Вернее работало все верно, просто наш 2ой
программист - который AI пишет,кой чего не доглядел.
Из-за этого уже при 3х врагах на карте доходило
до таких жутких тормозов. Вот те и 4 дня в попу...
А я уже незнал что и делать - вроде шароварку пишем
а требования получались выше чем у сталкера :)!!! ГЫ!!!

PS: во всем разобрались. Двигаемся дальше.
#18
12.05.07 04:33
0
MegaI2
какие термины) Я такими тож оперировать могу, только смыслу?) Сия "многозадачность" кажущаеся, и детские сказки о "быстром переключении между задачами, что незаметно для глаза человека" я рассказывать не буду :) А если один из потоков тормознутый, всеравно производительности кранты также как и "заступорение" аналогичного линейного подхода ;) Шаровары всеравно до такого не доходят и их не пишут для двухядерников :)

zephyr
успехов! и глядите за своим AI-писателем :)
Отредактировано: 12.05.07 04:37
#19
Mirage
12.05.07 16:23
0
Цитата
если при одном потоке:
Process
Draw

допустим процесс занимает 50мс а отрисовка 25мс, тоесть рендер каждый раз задерживаеться на 50мс
а при мультпаточности рендер не будет задерживаться вплотную до 50мс эта цифра будет поменьше
всётаки два потока и паралельна пашут, а ещё в двуядерных буит рулить


Если под рендером имеется в виду отрисока сцены видеокартой, то она будет происходить вообще неизвестно когда. Но точно не во время выполнения Draw. А Draw вернется сразу. "Это конечно если грамотно написать, с учетом асинхронности.
#20
mov, просто mov
12.05.07 20:02
0
Andru
в том что это нам сейчас ненужно ты прав :)
но всёж когда настанет эра многоядерных процессоров оно возмёт своё ^_^
Цитата

Draw вернется сразу

я от этом и говорю что Process будет остонавливать рендер ;)
Отредактировано: 12.05.07 20:07
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}