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

Никак не могу додумать, как такое сделать. Прошу помощи!


Такая задача:

Есть thread #1, в начале Execute которого создаю всякие вспомогательные COM-объекты, в конце их уничтожаю.
Thread #1 обычно должен простаивать, ничего не делая. Но время от времени какой-нибудь thread #2/#3/#4/... должен остановиться, бросить этому thread #1 данные и ждать, пока тот их не обработает. После чего вызвавший thread #2/#3/#4/... продолжит свою работу, а thread #1 будет ждать нового задания

заранее спасибо
11 май 18, 00:51    [21401614]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
Thread
Guest


К сообщению приложен файл. Размер - 14Kb
11 май 18, 00:51    [21401615]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
_Трейдер_
Guest
Есть много способов: Interlocked функции, Event-ы, мьютексы, etc...
Но вот в чем вопрос на зачем тебе этот поток, если во время его работы остальные потоки уснут?
11 май 18, 03:57    [21401712]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
Thread
Guest
Thread #1 нужен потому, что:

1) это не должен быть главный thread
2) из-за COM объектов
11 май 18, 08:27    [21401841]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24312
С моей библиотекой - легко. :)
11 май 18, 08:47    [21401872]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
kealon(Ruslan)
Member

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

обычная же очередь, добавить просто калбак на завершение таска

I/O Completion Ports

Thread,
обходишь косяки в RPC?
11 май 18, 08:55    [21401894]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24312
А что потоки 2_3_4 делают, кроме отправки задания и ожидания окончания? Нужны ли они?
11 май 18, 08:57    [21401899]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
Thread
Guest
Делают всякое, но, пожалуйста, давайте не будем отвлекать топик на это.

Вопрос (просьба) помочь с кодом, как сделать эту задержку.
11 май 18, 09:16    [21401944]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
Thread
Guest
kealon(Ruslan)
Thread,

обычная же очередь, добавить просто калбак на завершение таска

I/O Completion Ports

Thread,
обходишь косяки в RPC?



Спасибо, посмотрю.
Обхожу косяки ограниченности ресурсов
11 май 18, 09:20    [21401960]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
Zelius
Member

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

сделать поток с очередью сообщений и посылать туда сообщения из других потоков через SendMessage
11 май 18, 10:24    [21402247]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
kealon(Ruslan)
Member

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

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

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

сделать поток с очередью сообщений и посылать туда сообщения из других потоков через SendMessage
ога ..., и получить в полной красе то с чем он борется

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

Откуда: Донецк
Сообщений: 3562
Zelius
еще раз перечитал - все соответствует поставленной задаче

Да 100% очередь нужна. Например, виндовая c SendMessage.
11 май 18, 11:34    [21402441]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3312
Zelius
kealon(Ruslan)
пропущено...
ога ..., и получить в полной красе то с чем он борется

еще раз перечитал - все соответствует поставленной задаче
угу, особенно замечательно когда у тебя посыпятся "Canvas don't allow drawing" и прочие прелести вроде дедлоков на ровном месте
11 май 18, 11:46    [21402472]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3562
kealon(Ruslan)
особенно замечательно когда у тебя посыпятся "Canvas don't allow drawing" и прочие прелести вроде дедлоков на ровном месте
С каких делов они посыпятся?
11 май 18, 11:49    [21402487]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3312
YuRock
С каких делов они посыпятся?

MSDN
The sending thread is blocked until the receiving thread processes the message. However, the sending thread will process incoming nonqueued messages while waiting for its message to be processed. To prevent this, use SendMessageTimeout with SMTO_BLOCK set. For more information on nonqueued messages, see Nonqueued Messages.

Если будешь использовать не из главного потока проблем особых не будет, но всё меняется...

конкретно с "Canvas don't allow drawing" проблема в связке

    FCanvas.Handle := DC;
    try
      ...
    finally
      FCanvas.Handle := 0;
    end;
которая везде раскидана по VCL
11 май 18, 12:10    [21402607]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
чччД
Guest
Thread,
ZeroMQ + REQ-REP по протоколу inproc.
Кодировать три минуты, очередь искаропки, все бесплатно.
Отправляется сообщение, сообщение поступает в очередь треда - воркера, ждём ответа. Воркер, завершив предыдущее задание, выгребают из очерди следующее, работает, отправляет ответ заказчику. Заказчик, отправив задание, спит до получения ответа воркера. Никаких семафоров, мьютексов и прочей дичи, только сообщения.
11 май 18, 12:16    [21402638]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3562
kealon(Ruslan),

Ну, значит тогда можно использовать SendMessageTimeout with SMTO_BLOCK
11 май 18, 12:22    [21402665]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
kealon(Ruslan)
Member

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

можно и так, но IOС Port всё равно проще и прозрачнее
11 май 18, 12:35    [21402736]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3562
kealon(Ruslan),

ничё се проще :)
ну кому как.
11 май 18, 12:38    [21402753]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
kealon(Ruslan)
Member

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

ничё се проще :)
ну кому как.


чуть переделать
+
type
  TIOPort = class(TObject)
  private
    FPort: THandle;
  public
    constructor Create();
    destructor Destroy(); override;
    procedure PushBack(const AValue: Integer); inline;
    function PopFront(out AValue: Integer): Boolean; inline;
  end;
{ TIOPort }

constructor TIOPort.Create;
begin
  inherited Create;
  FPort := CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0);
  if (FPort = 0) then
    RaiseLastOSError();
end;

destructor TIOPort.Destroy;
begin
  if FPort <> 0 then begin
    CloseHandle(FPort);
    FPort := 0;
  end;
  inherited Destroy;
end;

function TIOPort.PopFront(out AValue: Integer): Boolean;
var
  TmpBytes: DWORD;
  TmpOverlapped: POverlapped;
begin
  Result := GetQueuedCompletionStatus(FPort, TmpBytes, ULONG_PTR(AValue), TmpOverlapped, INFINITE);
end;

procedure TIOPort.PushBack(const AValue: Integer);
begin
  if (not PostQueuedCompletionStatus(FPort, 0, UIntPtr(AValue), nil)) then
    RaiseLastOSError();
end;
строчек 50 добавится
и сравни с SendMessage : класс зарегать, протянуть оконную процу, ещё схлопать с организацией завершением цикла
ну его нафиг
11 май 18, 13:30    [21402954]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
stanilar
Member

Откуда: Спб
Сообщений: 735
Thread
Вопрос (просьба) помочь с кодом, как сделать эту задержку.

Ну, как-то то именно этому посвящена целая книга, если конечно делать все thread-like. А кроме книги есть еще куча материалов.

А по вопросу... Чем не устраивает:
  repeat
    Application.ProcessMessages();
  until Флаг;
11 май 18, 14:16    [21403114]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6251
stanilar
этому посвящена целая книга


PDF-версия
http://web.archive.org/web/20120522180418/http://podgoretsky.com/ftp/Docs/Delphi/DX/Martin Harvey - Threads.pdf
11 май 18, 14:37    [21403185]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5076
stanilar
А по вопросу... Чем не устраивает:
  repeat
    Application.ProcessMessages();
  until Флаг;
А что случится, если в этот момент я закрою окно?
11 май 18, 14:37    [21403187]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 898
begin

  // Этот код выполняется в главном потоке (например, Button1Click)

  EnterWorkerThread;
  try

    { Этот код выполняется во вторичном потоке }
    { Хотя это код Button1Click, но он выполняется, как если бы он был }
    { помещён в TThread.Execute. }

  finally
    LeaveWorkerThread;
  end;

  // Этот код выполняется в главном потоке

end;


http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1355
11 май 18, 14:39    [21403194]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / Delphi Ответить