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

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


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

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

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

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

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

I/O Completion Ports

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

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

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

I/O Completion Ports

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


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

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

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

сделать поток с очередью сообщений и посылать туда сообщения из других потоков через SendMessageога ..., и получить в полной красе то с чем он борется
еще раз перечитал - все соответствует поставленной задаче
...
Рейтинг: 0 / 0
11.05.2018, 11:34
    #39643141
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как организовать ожидание пока Thread не отработает задание
Zeliusеще раз перечитал - все соответствует поставленной задаче
Да 100% очередь нужна. Например, виндовая c SendMessage.
...
Рейтинг: 0 / 0
11.05.2018, 11:46
    #39643150
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как организовать ожидание пока Thread не отработает задание
Zeliuskealon(Ruslan)пропущено...
ога ..., и получить в полной красе то с чем он борется
еще раз перечитал - все соответствует поставленной задачеугу, особенно замечательно когда у тебя посыпятся "Canvas don't allow drawing" и прочие прелести вроде дедлоков на ровном месте
...
Рейтинг: 0 / 0
11.05.2018, 11:49
    #39643153
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как организовать ожидание пока Thread не отработает задание
kealon(Ruslan)особенно замечательно когда у тебя посыпятся "Canvas don't allow drawing" и прочие прелести вроде дедлоков на ровном местеС каких делов они посыпятся?
...
Рейтинг: 0 / 0
11.05.2018, 12:10
    #39643168
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как организовать ожидание пока Thread не отработает задание
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
11.05.2018, 12:16
    #39643174
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как организовать ожидание пока Thread не отработает задание
Thread,
ZeroMQ + REQ-REP по протоколу inproc.
Кодировать три минуты, очередь искаропки, все бесплатно.
Отправляется сообщение, сообщение поступает в очередь треда - воркера, ждём ответа. Воркер, завершив предыдущее задание, выгребают из очерди следующее, работает, отправляет ответ заказчику. Заказчик, отправив задание, спит до получения ответа воркера. Никаких семафоров, мьютексов и прочей дичи, только сообщения.
...
Рейтинг: 0 / 0
11.05.2018, 12:22
    #39643178
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как организовать ожидание пока Thread не отработает задание
kealon(Ruslan),

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

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

ничё се проще :)
ну кому как.
...
Рейтинг: 0 / 0
11.05.2018, 13:30
    #39643244
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как организовать ожидание пока Thread не отработает задание
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
11.05.2018, 14:16
    #39643272
stanilar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как организовать ожидание пока Thread не отработает задание
ThreadВопрос (просьба) помочь с кодом, как сделать эту задержку.
Ну, как-то то именно этому посвящена целая книга, если конечно делать все thread-like. А кроме книги есть еще куча материалов.

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

А что случится, если в этот момент я закрою окно?
...
Рейтинг: 0 / 0
11.05.2018, 14:39
    #39643285
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как организовать ожидание пока Thread не отработает задание
Код: 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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как организовать ожидание пока Thread не отработает задание / 25 сообщений из 78, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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