Используйте TThread.Synchronize и передайте ему другую анонимную функцию. Затем вы можете вызвать updateui в анонимной функции:
TThread.CreateAnonymousThread(
procedure
begin
// do whatever you want
TThread.Synchronize(nil,
procedure
begin
updateui();
end);
// do something more if you want
end
).Start();
Синхронизация обычно дорога (относительно производительности). Только делайте это, когда они действительно необходимы. Вы можете увеличить производительность, если вы расширяете updateui -метод, чтобы уменьшить операции рисования.
Это возможно для вызова SendMessage с помощью WM_SETREDRAW :
procedure StopDrawing(const Handle: HWND);
const
cnStopDrawing = 0;
begin
SendMessage(Handle, WM_SETREDRAW, cnStopDrawing, 0);
end;
procedure ContinueDrawing(const Handle: HWND);
const
cnStartDrawing = 0;
begin
SendMessage(Handle, WM_SETREDRAW, cnStartDrawing, 0);
// manually trigger the first draw of the window
RedrawWindow(Handle, nil, 0,
RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN);
end;
Добавить вызов StopDrawing () в верхней части updateui () и вызов ContinueDrawing () в конце updateui () . Вызов ContinueDrawing () должен быть в finally-block . Это гарантирует, что окно будет окрашено даже после возникновения исключения во время выполнения updateui.
Пример:
procedure TMain.updateui;
begin
try
StopDrawing(Handle);
Panel3.Show;
Label57.Caption := 'Change 1';
Label59.Caption := 'Change 2';
// ...
finally
// Code under finally gets executed even if there was an error
ContinueDrawing(Handle);
end;
end;
%
команда переходит к соответствию объекта под курсором. Расположите курсор на открытие (или закрытие) paren и используйте y%
для того, чтобы дергать или d%
для удаления всего от курсора до соответствия paren.
Это работает, потому что %
"команда движения", таким образом, она может использоваться где угодно, энергия ожидает такую команду. От [1 120] :help y
:
["x]y{motion} Yank {motion} text [into register x]. When no
characters are to be yanked (e.g., "y0" in column 1),
this is an error when 'cpoptions' includes the 'E'
flag.
По умолчанию, "объект" включает скобки, фигурные скобки, parens, комментарии C-стиля и различные операторы предварительного компилятора (#ifdef
, и т.д.).
существует плагин для "расширенного %, соответствующего", который можно найти на домашняя страница Vim .
можно прочитать документацию относительно [1 110] и связанные команды движения путем ввода :help various-motions
в командном режиме.
существует другой набор движения, управляет, чтобы можно было использовать в режиме Visual для выбора различных текстовых объектов.
Для решения определенной проблемы Вы сделали бы следующее:
printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
^
Скажем, Ваш курсор расположен в [1 112]. Введите следующую последовательность для выбора части, которую Вы ищете:
v2a)
Первый v
переходит к режиму Visual, тогда Вы определяете, что хотите пойти 2
уровни parens. Наконец эти a)
выбирает "блок". После этого можно использовать d
или x
для удаления, и т.д.
, Если Вы не хотите включать внешний parens, можно использовать "внутренний блок" вместо этого:
v2i)
См. :help object-select
для полного списка связанных команд.
Что относительно dib
или di(
.
Это удалит внутренний (...) блок, где курсор.
я люблю текстовый объект движения и выборы!
Можно использовать d % для удаления и y % для того, чтобы дергать.
Установите свой курсор на первую круглую скобку, затем нажмите v%y
или v%d
.