Nano Hash - криптовалюты, майнинг, программирование

TVirtaulStringTree — как активировать FocusChanged в режиме ожидания?

Попробую объяснить свою ситуацию:

Я использую VirtualTree в качестве сетки, и каждый раз, когда запускается событие OnFocusChanged и изменяется активный узел фокуса, у меня есть синхронная операция, которая может занять 0 -1 сек, что блокирует основной поток (иногда больше).

Я могу с этим смириться.
Пока я не могу перенести эту логику в рабочий поток.

Моя проблема возникает, когда я использую клавиши со стрелками для перемещения вверх и вниз по сетке, а узел фокуса быстро меняется. Это не гладко из-за блокировки.

Поэтому я попытался использовать сообщение Post, например:

procedure TForm1.VTFocusChanged(Sender: TBaseVirtualTree;
    Node: PVirtualNode; Column: TColumnIndex);
begin
  // if (T = 0) or (GetTickCount - T > 1000) then
  begin
    Sender.InvalidateNode(Node);
    PostMessage(Handle, UM_VT_CHANGED, Integer(Sender), Integer(Node));
  end;
end;

procedure TForm1.UMVTChanged(var Message: TMessage);
var
  Tree: TBaseVirtualTree;
  Node: PVirtualNode;
begin
  // T := GetTickCount;
  Tree := TBaseVirtualTree(Message.WParam);
  Node := PVirtualNode(Message.LParam);
  ...
  // DO the job! 
end;

Это немного помогает, но все же я понимаю, что мне нужен какой-то «холостой» механизм. Поэтому, если я перемещаю стрелки вверх и вниз, мой рабочий процесс будет запускаться только тогда, когда VirtualTree простаивает в течение 100 мс или около того. Я понимаю, что мне нужно использовать какой-то таймер или, может быть, «съесть» почтовые сообщения и обработать только последнее, но я не могу понять, как это сделать. Я пробовал много вариантов с TTimer/GetTickCount, и кажется, что я действительно испортил что-то настолько тривиальное.


  • Возможно, like this? 08.01.2014
  • @TLama, похоже, у меня не работает. PostMessage не отправляется все время, когда узел простаивает (if GetTickCount - FLastTick > 1000 then имеет значение false). поэтому, если я быстро перемещаюсь вниз и вверх обратно к первому узлу, иногда он публикуется, а иногда нет. но это близко к тому, что мне нужно. снова я не могу сосредоточиться на проблеме во время отладки :( 08.01.2014
  • Точно должно работать. Сообщение не будет публиковаться чаще, чем через одну секунду. Единственное, что вы упустили в своей попытке, это то, что вы не обновляли свою переменную T текущим значением счетчика тиков. 08.01.2014
  • @TLama, да, но последний сфокусированный / посадочный узел, чтобы говорить (после перемещения вниз + вверх), сфокусирован между промежутком в 100 мс, поэтому if является ложным. 08.01.2014

Ответы:


1

Я решил это с помощью TTimer. Лучшего способа придумать не удалось. Вот основная идея, и ее можно улучшить:

procedure TForm1.VTFocusChanging(Sender: TBaseVirtualTree; OldNode,
  NewNode: PVirtualNode; OldColumn, NewColumn: TColumnIndex;
  var Allowed: Boolean);
begin
  FocusTimer.Enabled := False;  
end;

procedure TForm1.VTFocusChanged(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex);
begin
  FLastNode := Node;
  FocusTimer.Interval := 250;
  FocusTimer.Enabled := True; 
end;

procedure TForm1.FocusTimer_OnTimer(Sender: TObject);
begin
  FocusTimer.Enabled := False;
  if FLastNode = nil then Exit;
  PostMessage(Handle, UM_VT_CHANGED, Integer(VT), Integer(FLastNode));
end;
09.01.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..