Текущий архив: 2008.01.27;
Скачать: CL | DM;
Вниз
Вопрос про многопоточность. Найти похожие ветки
← →
oxffff © (2007-12-24 20:26) [40]
> Sapersky (24.12.07 20:20) [37]
А если прикинь нажал кнопку, а результата нет.
Так что увы это критично.
← →
DiamondShark © (2007-12-24 20:28) [41]
> Нет, Я это твоя проблема.
Всё. Пипец. Ржу до слёз. :)
Лечись от манечки.
← →
oxffff © (2007-12-24 20:31) [42]
> @!!ex © (24.12.07 20:24) [39]
C DI время отклика будет лучше. Гораздо.
Работать очень просто.
Код с моего движка.
DirectInput8.CreateDevice(GUID_SysMouse,DirectInputDeviceMouse,nil);
//if DirectInputDevice.SetCooperativeLevel(Handle,DISCL_BACKGROUND or DISCL_NONEXCLUSIVE)=DI_OK then ;//showmessage("DI_OK");
//DirectInputDeviceMouse.SetCooperativeLevel(Handle,DISCL_FOREGROUND);
DirectInputDeviceMouse.SetCooperativeLevel(Handle,DISCL_NONEXCLUSIVE or DISCL_BACKGROUND);
DirectInputDeviceMouse.SetDataFormat(c_dfDIMouse);
DirectInputDeviceMouse.Acquire;
DirectInput8.CreateDevice(GUID_SysKeyboard,DirectInputDeviceKeyboard,nil);
DirectInputDeviceKeyboard.SetCooperativeLevel(Handle,DISCL_FOREGROUND);
DirectInputDeviceKeyboard.SetDataFormat(c_dfDIKeyboard);
DirectInputDeviceKeyboard.Acquire;
Обработка
param.DirectInputDeviceKeyboard.GetDeviceState(sizeof(diKeys),@diKeys);
if diKeys[DIK_ESCAPE]=$80 then param.DirectInputDeviceMouse.Unacquire;
if diKeys[DIK_W]=$80 then Camera.Walk(300);
if diKeys[DIK_S]=$80 then Camera.Walk(-300);
if diKeys[DIK_A]=$80 then Camera.Yaw(-0.005);
if diKeys[DIK_D]=$80 then Camera.Yaw(0.005);
if param.DirectInputDeviceMouse.GetDeviceState(sizeof(DIMOUSESTATE),@MouseState)=DI _OK then
begin
if MouseState.rgbButtons[0]>0 then Camera.Walk(300);
if MouseState.rgbButtons[1]>0 then Camera.Walk(-300);
if MouseState.lX<>0 then Camera.Yaw(-MouseState.lX/900);
if MouseState.lY<>0 then Camera.Pitch(-MouseState.lY/900);
Camera.CalculateMatrixView(matrixView);
setTransform(D3DTS_VIEW,matrixView);
end;
← →
DiamondShark © (2007-12-24 20:31) [43]
> oxffff © (24.12.07 20:26) [40]
>
> А если прикинь нажал кнопку, а результата нет.
А прикинь, нажал на кнопку, а поток циклом пересылки массива занят. А когда поток освободился, то кнопку уже отпустили.
Трагедия, однако. ;)
Опять фантазии. Теперь на тему критичности приложения.
← →
oxffff © (2007-12-24 20:33) [44]
> DiamondShark © (24.12.07 20:28) [41]
А ты читай книжки и набивай всою пустую башку.
Родился в день знаний и не хрена не знаешь.
Еще и статьи пишешь.
Как тебя только допустили до статей?
← →
@!!ex © (2007-12-24 20:33) [45]> Ты реально бестолковый дятел.
> Увы запись байта атомарна.
> А вот состояние всего массива не согласовано.
ну и что?
Отклик за 20 мс(это примерно 40 фпс) никто не заметит. Ибо ниочем.
Так что то, что обновится только полокина массива - это фигня.
Меня волновало именно то, что не будет AV.
← →
oxffff © (2007-12-24 20:36) [46]
> DiamondShark © (24.12.07 20:31) [43]
Ты реально даже прочитать не можешь SDK.
An application can call this function to retrieve the current status of all the virtual keys. The status changes as a thread removes keyboard messages from its message queue.
← →
oxffff © (2007-12-24 20:38) [47]
> @!!ex © (24.12.07 20:33) [45]
Другой поток может вообще не увидить никакого обновления в течении длительного времени на мнопроцессорной машине.
Жмешь кнопку и никакого отклика.
Поток чтения не видит обновления.
← →
DiamondShark © (2007-12-24 20:41) [48]
> oxffff © (24.12.07 20:36) [46]
Ты тормоз. ;)
← →
@!!ex © (2007-12-24 20:46) [49]Товарищи модераторы, пожалуйста закройте ветку!
Не хочеться, чтобы два хороших человека ругались из-за ерунды!
Задача решена через GetAsyncKeyState:procedure TKeys.Update;
var
Index:integer;
Key:Smallint;
begin
for Index:=0 to 255 do begin
Key:=GetAsyncKeyState(Index);
if Key And $8000<> OldKeys[Index] And $8000 then begin
Keys[Index]:=(Key And $8000)<>0;
OldKeys[Index]:=Key;
end;
end;
end;
Sapersky, спасибо!
← →
oxffff © (2007-12-24 20:47) [50]
> DiamondShark © (24.12.07 20:41) [48]
>
> > oxffff © (24.12.07 20:36) [46]
>
> Ты тормоз. ;)
Плакалъ.А ты замерь пересылку.
А прикинь нажал кнопку, и никакого результата.
Страницы: 1 2 вся ветка
Текущий архив: 2008.01.27;
Скачать: CL | DM;
Память: 0.56 MB
Время: 0.016 c