Я предпочитаю JQuery. Это чище и легко читается.
$.each($.parseJSON(data), function (key, value) {
alert(value.<propertyname>);
});
Используйте 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;