powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как организовать ожидание пока Thread не отработает задание
25 сообщений из 78, страница 1 из 4
Как организовать ожидание пока Thread не отработает задание
    #39642966
Thread
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

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


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

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

заранее спасибо
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39642967
Thread
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39642978
_Трейдер_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть много способов: Interlocked функции, Event-ы, мьютексы, etc...
Но вот в чем вопрос на зачем тебе этот поток, если во время его работы остальные потоки уснут?
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643001
Thread
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Thread #1 нужен потому, что:

1) это не должен быть главный thread
2) из-за COM объектов
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643010
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С моей библиотекой - легко. :)
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643014
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Thread,

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

I/O Completion Ports

Thread,
обходишь косяки в RPC?
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643017
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что потоки 2_3_4 делают, кроме отправки задания и ожидания окончания? Нужны ли они?
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643035
Thread
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делают всякое, но, пожалуйста, давайте не будем отвлекать топик на это.

Вопрос (просьба) помочь с кодом, как сделать эту задержку.
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643040
Thread
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)Thread,

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

I/O Completion Ports

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


Спасибо, посмотрю.
Обхожу косяки ограниченности ресурсов
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643085
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Thread,

сделать поток с очередью сообщений и посылать туда сообщения из других потоков через SendMessage
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643124
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZeliusThread,

сделать поток с очередью сообщений и посылать туда сообщения из других потоков через SendMessageога ..., и получить в полной красе то с чем он борется
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643127
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)ZeliusThread,

сделать поток с очередью сообщений и посылать туда сообщения из других потоков через SendMessageога ..., и получить в полной красе то с чем он борется
еще раз перечитал - все соответствует поставленной задаче
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643141
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zeliusеще раз перечитал - все соответствует поставленной задаче
Да 100% очередь нужна. Например, виндовая c SendMessage.
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643150
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zeliuskealon(Ruslan)пропущено...
ога ..., и получить в полной красе то с чем он борется
еще раз перечитал - все соответствует поставленной задачеугу, особенно замечательно когда у тебя посыпятся "Canvas don't allow drawing" и прочие прелести вроде дедлоков на ровном месте
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643153
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)особенно замечательно когда у тебя посыпятся "Canvas don't allow drawing" и прочие прелести вроде дедлоков на ровном местеС каких делов они посыпятся?
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643168
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockС каких делов они посыпятся?
MSDNThe 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" проблема в связке

Код: pascal
1.
2.
3.
4.
5.
6.
    FCanvas.Handle := DC;
    try
      ...
    finally
      FCanvas.Handle := 0;
    end;

которая везде раскидана по VCL
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643174
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Thread,
ZeroMQ + REQ-REP по протоколу inproc.
Кодировать три минуты, очередь искаропки, все бесплатно.
Отправляется сообщение, сообщение поступает в очередь треда - воркера, ждём ответа. Воркер, завершив предыдущее задание, выгребают из очерди следующее, работает, отправляет ответ заказчику. Заказчик, отправив задание, спит до получения ответа воркера. Никаких семафоров, мьютексов и прочей дичи, только сообщения.
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643178
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

Ну, значит тогда можно использовать SendMessageTimeout with SMTO_BLOCK
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643188
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

можно и так, но IOС Port всё равно проще и прозрачнее
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643194
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

ничё се проще :)
ну кому как.
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643244
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockkealon(Ruslan),

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

чуть переделать
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
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 : класс зарегать, протянуть оконную процу, ещё схлопать с организацией завершением цикла
ну его нафиг
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643272
stanilar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ThreadВопрос (просьба) помочь с кодом, как сделать эту задержку.
Ну, как-то то именно этому посвящена целая книга, если конечно делать все thread-like. А кроме книги есть еще куча материалов.

А по вопросу... Чем не устраивает:
Код: pascal
1.
2.
3.
  repeat
    Application.ProcessMessages();
  until Флаг;
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643282
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643283
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stanilarА по вопросу... Чем не устраивает:
Код: pascal
1.
2.
3.
  repeat
    Application.ProcessMessages();
  until Флаг;

А что случится, если в этот момент я закрою окно?
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39643285
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
begin

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

  EnterWorkerThread;
  try

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

  finally
    LeaveWorkerThread;
  end;

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

end;



http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1355
...
Рейтинг: 0 / 0
25 сообщений из 78, страница 1 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как организовать ожидание пока Thread не отработает задание
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]