Как уменьшить использование ЦП при перемещении компонента в событие OnMouseMove в Delphi 7?

Попробуйте следующим образом. Передайте индекс для указанного адреса, прочитайте элемент контактов для этого конкретного адреса и добавьте новую группу контактов.

addPhoneNumber(index: number): void {
    this.addressArray[index].contacts.push(this.contactsGroup());
    console.log(this.addressArray[index].contacts);
}

Надеюсь, это поможет !!!

6
задан Costique 5 May 2012 в 06:25
поделиться

6 ответов

Наконец я имею, изменяют мой код для этого:

procedure MyComponent.MouseMove(Sender: TObject;Shift: TShiftState; X, Y: Integer);
begin
  if GetTickCount-LastMoveTick>50 then begin
    AnotherComponent.Top := Y;
    AnotherComponent.Left := X;
    LastMoveTick := GetTickCount;
  end;
end;

Действительно легкий реализовать (2 добавленные строки), никакой таймер, работы хорошо для меня...

3
ответ дан 9 December 2019 в 22:39
поделиться
  1. Это не имеет никакого отношения к самому Перемещению Мыши.
  2. Если это не то, что Вы предназначили, Вы не сочетаетесь X, Y с Вершиной, Левой. Вершина является Y coord и Оставленный X один.
  3. Проблемой является фактическое перемещение AnotherComponent.

Чтобы попытаться понять это, я предлагаю, чтобы Вы записали стандартную программу TestMove, которая перемещает Ваш AnotherComponent автоматически с корректируемым повторением/задержками для контроля ЦП.
Я держал пари, что это инициировало дорогостоящее перекрашивание или некоторый другой ЦП интенсивное вычисление.
Поэтому Исследуйте тесно, если у Вас есть какой-либо обработчик событий на этом компоненте сначала, затем пойдите с наследованным поведением...

3
ответ дан 9 December 2019 в 22:39
поделиться

Возможно, вместо того, чтобы переместить сам компонент Вы перемещаете 'теневое' и только перемещаете компонент, после того как пользователь позволяет кнопке мыши пойти. Вид подобного drag&drop.

1
ответ дан 9 December 2019 в 22:39
поделиться

Вы могли создать TTimer, который опрашивает текущее положение мыши каждые 0.10 секунды или так, затем положения "AnotherComponent" согласно текущему положению мыши.

Затем Вы не уволили бы свое событие за каждый пиксель движения мыши - Вам не будет нужно никакое событие OnMouseMove на Вашем компоненте управления вообще.

На моем компьютере это в основном не оказывает влияния производительности вообще.

procedure TForm1.Timer1Timer(Sender: TObject);
var
  pt: TPoint;
begin
  //Is the cursor inside the controlling component?  if so, position some
  //other control based on that mouse position.

  GetCursorPos(pt);
  if MouseWithin(pt.x,pt.y,MyComponent,Form1.Left,Form1.Top) then begin
    //replace with whatever real positioning logic you want
    AnotherComponent.Top := pt.y;
    AnotherComponent.Left := pt.x;
  end;
end;

function TForm1.MouseWithin(mouseX, mouseY: integer;
  const comp: TWinControl; const ParentWindowLeft: integer;
  const ParentWindowTop: integer): boolean;
var
  absoluteCtrlX, absoluteCtrlY: integer;
begin
  //take a control, and the current mouse position.
  //tell me whether the cursor is inside the control.
  //i could infer the parent window left & top by using ParentwindowHandle
  //but I'll just ask the caller to pass them in, instead.

  //get the absolute X & Y positions of the control on the screen
  //needed for easy comparison to mouse position, which will be absolute
  absoluteCtrlX := comp.Left + ParentWindowLeft;
  absoluteCtrlY := comp.Top + ParentWindowTop +
    GetSystemMetrics(SM_CYCAPTION);

  Result := (mouseX >= absoluteCtrlX)
    and (mouseX < absoluteCtrlX + comp.Width)
    and (mouseY >= absoluteCtrlY)
    and (mouseY <= absoluteCtrlY + comp.Height);
end;
4
ответ дан 9 December 2019 в 22:39
поделиться

Это не может быть само перемещение, для которого нужна такая мощность ЦП, по всей вероятности перемещение заставляет компонент перерисовывать себя так или иначе. Можно ли избежать этого AnotherComponent перерисовывается на каждом перемещении? Это не должно быть необходимо, если это не контейнер фильма.

0
ответ дан 9 December 2019 в 22:39
поделиться

Что-либо связанное с событием перемещения мыши будут называть очень часто, поскольку мыши являются устройством ввода данных высокого разрешения. Я не волновался бы об использовании CPU хотя, потому что Ваш обработчик только запущен максимально быстро на основе того, насколько занятый система. Другими словами, это - только maxing ЦП, потому что ничто иное не.

Из MSDN:

Мышь генерирует входное событие, когда пользователь перемещает мышь, или нажимает или отпускает кнопку мыши. Система преобразовывает входные события мыши в сообщения и отправляет их на очередь сообщений соответствующего потока. Когда сообщения мыши добавлены быстрее, чем поток может обработать их, система отбрасывает все кроме нового сообщения мыши.

Теперь могут быть некоторые исключения к этому. Вы могли сделать некоторое тестирование, чтобы быть уверенными путем выполнения некоторого другого обрабатывающего интенсивного действия и видеть, насколько материал перемещения мыши влияет на него.

0
ответ дан 9 December 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: