Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
2-1198917596
Dana
2007-12-29 11:39
2008.01.27
Ограничение на ввод в строки DBGrid


2-1198618035
Евгений Р.
2007-12-26 00:27
2008.01.27
Высота заголовка формы


2-1198877639
mr1Andersen
2007-12-29 00:33
2008.01.27
txt


2-1198485628
Dana
2007-12-24 11:40
2008.01.27
Из Delphi в Excel


6-1179135826
DVM
2007-05-14 13:43
2008.01.27
Программа c IdUDPServer вываливается в окно CPU