Delphi - последний запущенный поток

90
13 января 2022, 17:10

Есть запрос 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);

Разумеется, проблема в том, что неизвестно, когда закончится какой тред. Допустим, юзер внес изменение в грид, оно записалось в БД, сразу после этого начинает идти запрос. Но тут же юзер решает отфильтровать датасет по какому-то полю, и это уже другой запрос. Но никто не гарантирует, что последний запрос выполнится позже. В итоге может быть ситуация, что предыдущий запрос выполняется позже последнего, и юзеру высвечивается не та инфа, которую он искал. Причем иногда уже после отображения правильной инфы.

Какой правильный способ такого избежать? Спасибо!

Answer 1

Если я правильно Вас понял, то нужно по завершению Вашего трудоемкого процесса вызывать Thread.Terminate исполняющего его потока. таким образом вы будете знать о состоянии потока на данный момент и создать диспетчер очереди который будет ставить все остальные вызовы в очередь, и смотреть за состоянием исполняемого потока, и соответственно запускать задачу только после того как текущий поток изменит свой статус terminated

READ ALSO
Подключение блока при прокрутке к месту или через некоторое время после загрузки страницы

Подключение блока при прокрутке к месту или через некоторое время после загрузки страницы

На сайте https://alisa-musicru/ есть блок Клипы с множеством Youtube ifarme что приводит к долгой загрузке сайта, и соответственно снижению рейтинга в поисковиках

162
Подскажите, почему возникает ошибка?

Подскажите, почему возникает ошибка?

Необходимо, чтобы ф-ия удаляла букву 'o' в слове worldПодскажите, почему возникает ошибка в коде?

110
Не могу поместить value в функцию

Не могу поместить value в функцию

друзья! Проблема вот в чемРешил я написать примитивный калькулятор и все получилось, НО, в каждой функции математической операции лежит переменная...

116