Есть запрос MySQL, выполняется долго, поэтому выполняю его в потоке. Использую для этого TThread.CreateAnonymousThread(). Написал такую процедуру:
Procedure DualThreadEvent (pThreadProc:TProc;MainThreadProc:TProc);
Begin
TThread.CreateAnonymousThread (Procedure Begin
Try
if Assigned (pThreadProc) then
pThreadProc;
Except
On EAbort Do Exit;
End;
if Assigned (MainThreadProc) then
TThread.Queue(NIL,Procedure Begin
MainThreadProc;
End);
End).Start;
End;
Соответственно, в нужном месте ее вызываю:
DualThreadEvent(
Procedure
Begin
if Not _Alive.V then
Exit;
// Обращение к БД и запись данных в заранее созданный класс
End,
Procedure
Begin
if not _Alive.V then
Exit;
// Запись из класса в DBGrid
End);
Разумеется, проблема в том, что неизвестно, когда закончится какой тред. Допустим, юзер внес изменение в грид, оно записалось в БД, сразу после этого начинает идти запрос. Но тут же юзер решает отфильтровать датасет по какому-то полю, и это уже другой запрос. Но никто не гарантирует, что последний запрос выполнится позже. В итоге может быть ситуация, что предыдущий запрос выполняется позже последнего, и юзеру высвечивается не та инфа, которую он искал. Причем иногда уже после отображения правильной инфы.
Какой правильный способ такого избежать? Спасибо!
Если я правильно Вас понял, то нужно по завершению Вашего трудоемкого процесса вызывать Thread.Terminate
исполняющего его потока. таким образом вы будете знать о состоянии потока на данный момент и создать диспетчер очереди который будет ставить все остальные вызовы в очередь, и смотреть за состоянием исполняемого потока, и соответственно запускать задачу только после того как текущий поток изменит свой статус terminated
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
На сайте https://alisa-musicru/ есть блок Клипы с множеством Youtube ifarme что приводит к долгой загрузке сайта, и соответственно снижению рейтинга в поисковиках
Необходимо, чтобы ф-ия удаляла букву 'o' в слове worldПодскажите, почему возникает ошибка в коде?
друзья! Проблема вот в чемРешил я написать примитивный калькулятор и все получилось, НО, в каждой функции математической операции лежит переменная...