Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
stanilar
Member

Откуда: Спб
Сообщений: 721
Квейд
А что случится, если в этот момент я закрою окно?


Это зависит от наличия программиста на проекте.

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  repeat
    Application.ProcessMesagess();
  until Флаг ;
end;
11 май 18, 14:41    [21403204]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1333
kealon(Ruslan),

не надо ничего регистрировать, уже все готовое есть - AllocateHWnd и цикл стандартный выборки из очереди сообщений
11 май 18, 14:44    [21403217]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3267
Zelius
kealon(Ruslan),

не надо ничего регистрировать, уже все готовое есть - AllocateHWnd и цикл стандартный выборки из очереди сообщений
т.е. то что она не threadsafe вас никак не смущает?
11 май 18, 14:49    [21403242]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1333
kealon(Ruslan),

есть такая фигня, да, но не смущает, я ею часто пользуюсь, небезопасность легко обходится вызовом в главном потоке перед созданием доп потока
11 май 18, 15:14    [21403336]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3528
Zelius
небезопасность легко обходится вызовом в главном потоке перед созданием доп потока

Как же оно тогда, окошко бедное, будет работать через цикл сообщения доп. потока?
11 май 18, 15:16    [21403342]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
Миксионисюни
Guest
Идиотизм использовать несколько потоков,что бы в этих потоках ждать выполнения запущенного потока.

Тогда и одного потока с головой хватит, написав код линейно
11 май 18, 15:40    [21403443]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1333
YuRock
Zelius
небезопасность легко обходится вызовом в главном потоке перед созданием доп потока

Как же оно тогда, окошко бедное, будет работать через цикл сообщения доп. потока?

нее, вызвать в главном, а потом в дополнительном спокойно вызывать
11 май 18, 15:42    [21403454]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3267
Zelius
нее, вызвать в главном, а потом в дополнительном спокойно вызывать
MakeObjectInstance тоже не threadsafe, шикарно будет когда на массовом проекте встретите ещё такого же оптимизатора
11 май 18, 15:53    [21403502]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3267
Миксионисюни
Идиотизм использовать несколько потоков,что бы в этих потоках ждать выполнения запущенного потока.

Тогда и одного потока с головой хватит, написав код линейно
абсолютно согласен, осталось только микрософт убедить подправить пару мелочей
11 май 18, 15:54    [21403505]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10493
procedure Thread1.Execute;
var
  Res: Cardinal;
  Handles: array[0..0] of THandle;
begin
  .............
  Handles[0] := TermanateEvent;
  while not Terminated do begin
    Res := MsgWaitForMultipleObjects(1, @Handles[0], False, INFINITE, QS_ALLPOSTMESSAGE);
    case Res of
      WAIT_OBJECT_0: Terminate;
      WAIT_OBJECT_0 + 1: DoPeekMessages;
  end;
end;

procedure TThread1.DoPeekMessages;
var
  LMsg: TMsg;
begin
  while PeekMessage(LMsg, 0, 0, 0, PM_REMOVE) do
    DoMessage(LMsg);
end;

procedure TThread1.DoMessage(const AMsg: TMsg);
var
  LMsg: TMessage;
begin
  LMsg.Msg := AMsg.message;
  LMsg.WParam := AMsg.wParam;
  LMsg.LParam := AMsg.lParam;
  LMsg.Result := 0;
  Dispatch(LMsg);
end;

procedure TThread1.TMMyMsg(var AMsg: TMessage);
begin
  DoProcess(Pointer(AMsg.WParam));
  SetEvent(AMsg.LParam);
end;

procedure Thread2.Execute;
var
  WaitEvent: THandle;
begin
  WaitEvent := CreateEvent(nil, False, False, nil);
  ............
  PostThreadMessage(Thread1.ThreadID, TM_MY_MSG, WPARAM(@Data), WaitEvent);
  WaitForSingleObject(WaitEvent, INFINITE);
  ............
  CloseHandle(WaitEvent);
end;
11 май 18, 15:56    [21403516]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3267
_Vasilisk_,

с PostThreadMessage те же прелести что и с SendMessage21402607, и обходной функции нет
11 май 18, 16:24    [21403620]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
Thread
Guest
Спасибо всем за обсуждение
Я здесь, никуда не делся.
11 май 18, 17:24    [21403799]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3528
Миксионисюни
Идиотизм использовать несколько потоков,что бы в этих потоках ждать выполнения запущенного потока.

Тогда и одного потока с головой хватит, написав код линейно
Не идиотизм, если нужна очередь - строго последовательное исполнение заданий, полученных из разных потоков.
11 май 18, 22:25    [21404265]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3528
Zelius
YuRock
пропущено...

Как же оно тогда, окошко бедное, будет работать через цикл сообщения доп. потока?

нее, вызвать в главном, а потом в дополнительном спокойно вызывать
Что вызывать? Если ты сделал CreateWindow в главном потоке, то это окно будет "принажлежать" главному потоку, и сообщения ему будут в нем приходить только.
11 май 18, 22:37    [21404278]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
чччД
Guest
YuRock
Миксионисюни
Идиотизм использовать несколько потоков,что бы в этих потоках ждать выполнения запущенного потока.

Тогда и одного потока с головой хватит, написав код линейно
Не идиотизм, если нужна очередь - строго последовательное исполнение заданий, полученных из разных потоков.

Тебе о другом говорят: отправляешь задание и ждешь результатов - чем лучше ожидание результата по сравнению с (например) просто вызовом нужной функции прямо в контексте данного треда?
11 май 18, 22:57    [21404313]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
Миксионисюни
Guest
YuRock,

+
Картинка с другого сайта.


Пояснение, у нас есть уже поток, вместо того что бы вызывать новые потоки, мы можем вызывать функции

+
Картинка с другого сайта.


Я уже чувствую как твои идеалы рушатся на корню.


чччД слишком заумно высказал
11 май 18, 23:15    [21404329]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3528
чччД
YuRock
пропущено...
Не идиотизм, если нужна очередь - строго последовательное исполнение заданий, полученных из разных потоков.

Тебе о другом говорят: отправляешь задание и ждешь результатов - чем лучше ожидание результата по сравнению с (например) просто вызовом нужной функции прямо в контексте данного треда?
Ничем только в случае, если это задание выполняется изолированно. А если это команда на устройство на открытом компорте? Нужна и очередь, и ожидание исполнения.
11 май 18, 23:51    [21404363]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3528
Миксионисюни
Я уже чувствую как твои идеалы рушатся на корню.


чччД слишком заумно высказал
чччД правильно сказал, только ты не понял, что он сказал об общем (и частном в то же время) случае. Да, бывает, такое бессмысленно, и конечно можно просто вызвать функцию. А бывает - что жругого выхода нет и нвдо ждать окончания задания именно в другом потоке (который обрабатывает очередь).
Думаю, именно эта задача у ТС - активыксы какие-то создаются, видимо, для работы с устройствами.
11 май 18, 23:56    [21404370]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3267
YuRock
Миксионисюни
Идиотизм использовать несколько потоков,что бы в этих потоках ждать выполнения запущенного потока.

Тогда и одного потока с головой хватит, написав код линейно
Не идиотизм, если нужна очередь - строго последовательное исполнение заданий, полученных из разных потоков.
для этого достаточно критической секции


YuRock
Zelius
пропущено...

нее, вызвать в главном, а потом в дополнительном спокойно вызывать
Что вызывать? Если ты сделал CreateWindow в главном потоке, то это окно будет "принажлежать" главному потоку, и сообщения ему будут в нем приходить только.

я так понял, что он имел ввиду что там ленивая инициализация и достаточно один раз предварительно запустить, но это не так, дело портит MakeObjectInstance
12 май 18, 00:09    [21404395]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3528
kealon(Ruslan)
для этого достаточно критической секции
Ну правильно. Одной критической секции достаточно для организации элементарной очереди. Без всяких виндовых SendMessage, IOCP и проч.
12 май 18, 00:13    [21404400]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
stanilar
Member

Откуда: Спб
Сообщений: 721
Миксионисюни
Тогда и одного потока с головой хватит, написав код линейно


Линейный код сложно разделить на модули.

Именно тот случай, когда ощущается отсталость Дельфи. В данном случае в виде малого количества компонент для реактивного программирования.
12 май 18, 00:17    [21404408]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3528
stanilar,

Спасибо, поржал перед сном
12 май 18, 00:23    [21404417]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
Миксионисюни
Guest
на самом то деле, задача выглядит так

1) Создание всех ком объектов
2) Создание цикла - который будет ждать некий конечный статус, а пока его нет - выполнятся бесконечно
3) Делать проверку ту самую (Которую хотели вынести в отдельный поток, и поток первый ждал бы пока второй поток отработает, и вернёт эту метку на проверку)
4) В проверке делать что хотелось
5) После получения метки конца главного цикла, после цикла уничтожить созданные ком объекты - избавить код от постоянном пересоздание и удалении.



stanilar,

Ржу не могу)
Модули = функции.
12 май 18, 01:10    [21404468]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
stanilar
Member

Откуда: Спб
Сообщений: 721
Миксионисюни
Модули = функции


А меня учили что в Дельфи для модульности используются Unit'ы.

Миксионисюни
Ржу не могу)


Грех смеяться над отсталыми.
12 май 18, 01:21    [21404472]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2813
stanilar
Миксионисюни
Тогда и одного потока с головой хватит, написав код линейно


Линейный код сложно разделить на модули.

Именно тот случай, когда ощущается отсталость Дельфи. В данном случае в виде малого количества компонент для реактивного программирования.


Закусывать надо.
12 май 18, 12:21    [21404787]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
Все форумы / Delphi Ответить