I`m с помощью Delphi XE6 и UniDAC и MySQLОбновить Запросы в Threads
У меня есть некоторые компоненты TUniQuery в моем DM, и я хочу, чтобы обновить тему несколько раз, так что я положил некоторые Таймеры в моей основной форме и в каждом таймере Я создаю поток и передать запрос к нему для обновления данных:
для примера:
TUpdateThread = class(TThread)
private
FQuery : TUniQuery;
FResultHandle : THandle;
public
constructor Create(var Query : TUniQuery; ResultHandle : THandle);
protected
procedure Execute; override;
end;
constructor TUpdateThread.Create(var Query: TUniQuery; ResultHandle : THandle);
begin
inherited Create;
Suspend;
FQuery := Query;
FResultHandle := ResultHandle;
FreeOnTerminate := True;
Resume;
end;
procedure TUpdateThread.Execute;
var
Msg : String;
B : Boolean;
begin
try
B := True;
try
FQuery.Refresh;
except
on E:Exception do
begin
B := False;
Msg := 'Error : ' + #13 + E.Message;
SendMessage(FResultHandle, MSG_UPDATERESULT, 2, Integer(Msg));
end;
end;
finally
if B = True then
SendMessage(FResultHandle, MSG_UPDATERESULT, 1, 1);
Terminate;
end;
end;
Иногда это `ы сделано успешно, но много раз я получил некоторые ошибки, такие как AVs или«Net заголовок упаковки. .. "ошибка или иногда у меня есть проблема m в моих сетках (Ehlib DBGrid), таких как ошибка в рисовании строк или ... (особенно, когда я использую DisableControls и EnableControls) Все запросы имеют одинаковое соединение, я думаю, каждый поток должен иметь свое собственное соединение из-за всех интервалов таймеров такое же, я полагаю, иногда освежающие запросы прерываний, каждые другие
на самом деле, моя база данных находятся на сервере VPS, и есть некоторые клиентские приложения, я хочу, чтобы иметь Live-таблицу в клиентах и обновление тему неоднократно
Что это лучший способ достичь этого? Как я должен обновлять свои таблицы без зависания приложения! есть некоторые компоненты как TThreadTimer (или ...), тема полезная для этой ситуации?!
благодаря ...
Не используйте приостановку/возобновление. Эти методы устарели.Вместо этого создайте приостановленный поток и «запустите» его при инициализации – Johan
Не отправляйте «SendMessage» из своего потока. Подумайте, что произойдет, если приемник начнет обрабатывать его. Используйте «PostMessage» или «SendMessageTimeout», чтобы убедиться, что ваш поток не будет умирать в этой строке. Вот почему 'Синхронизация' не реализована, как только этот вызов одной функции. – TLama
@TLama: но Postmessage отправил сообщение в очередь messae и получил задержку! , много раз, когда я создаю поток, я показываю окно ожидания, и нет работы до тех пор, пока сообщение не поступит –