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

Откуда: Казань
Сообщений: 5840
Наткнулся на непонятки в DX10.2.3_CE: если создать доп.поток приостановленным, например так:
constructor TMyThread.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
  FreeOnTerminate:= False;
  Priority:= tpLower;

  if Suspended then Start;
//  if Suspended then Resume;
end;

а затем запустить рекомендуемой процедурой Start, то получаем отлуп

Cannot call Start on a running or suspended thread.


Старый добрый Resume, показываемый в Code Insight серым цветом (deprecated же), запускает поток корректно. Я что-то пропустил?
1 ноя 18, 01:44    [21720983]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
Док
Я что-то пропустил?

Очень много... Уже и не помню, с какой версии такое поведение.
Даже в fpc пишут:
procedure TThread.Start;
begin
  { suspend/resume are now deprecated in Delphi (they also don't work
    on most platforms in FPC), so a different method was required
    to start a thread if it's create with fSuspended=true -> that's
    what this method is for. }
  Resume;
end;  
1 ноя 18, 07:46    [21721026]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
wadman
Даже в fpc пишут

но мне нужно ехать, а не шашечки. :)

Как быть? По-прежнему запускать посредством Resume? Или есть более кошерный, но работающий способ?

зы. на Лазаре применение Resume/Start нареканий не вызывает (кроме пресловутого предупреждения о deprecated). А вот на последних дельфях ...
1 ноя 18, 10:41    [21721192]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
zinpub
Member

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

Кошерно - через TEvent...
1 ноя 18, 11:05    [21721218]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
Док
Или есть более кошерный, но работающий способ?

Уже написали. У меня аналогично: поток стартует, готовит очередь и засыпает.
1 ноя 18, 11:20    [21721236]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
zinpub
Кошерно - через TEvent...

ага, знаю я вас. Сначала эвенты, потом мютексы, семафоры, критические функции и проч.проч.

Нафик, допилю 10-летней давности проект на D2007 и уйду на Лазарь :)

зы. Рустам, перенеси, плз, относящиеся к теме посты в отдельную ветку. Думал, только спросить, а тут "вон оно, чо" ©
1 ноя 18, 12:55    [21721399]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
wadman
Уже написали.

т.е. приостановленный поток топорным способом не запустить, а только через SetEvent?
1 ноя 18, 13:08    [21721427]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
zinpub
Member

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

Зато наглядно, в случае suspend/resume - не угадаешь - где остановился поток.
1 ноя 18, 13:30    [21721466]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
Док
wadman
Уже написали.

т.е. приостановленный поток топорным способом не запустить, а только через SetEvent?

Топорным способом - это не кашерно и не предсказуемо.
1 ноя 18, 14:11    [21721521]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
wadman
Топорным способом - это не кашерно и не предсказуемо.

у меня поток выполняет одноразовую работу. А твой совет нарушает принцип бритвы Оккамы :)

зы. иногда желание довести все до "совершенства" рождает трудно читаемый код
1 ноя 18, 16:15    [21721725]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
Док
А твой совет нарушает принцип бритвы Оккамы :)

Нисколько. Как раз необходимость корректно завершить/остановить поток это необходимость.
Другое дело, что не все так считают. Кто-то и "пожалуйста" не считает нужным говорить.
1 ноя 18, 16:34    [21721753]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
Док
А твой совет нарушает принцип бритвы Оккамы :)

Вот минимальный поток с доп. функционалом:
+
unit Unit2;

{$mode objfpc}{$H+}

interface

uses
    Classes, SysUtils, Forms, Controls, Graphics, Dialogs, syncobjs, Windows;

const
    WM_USER = 1024;

type

    { TMyThread }

    TMyThread = class(TThread)
    private
        FEvent: TEvent;
        FOwner: TForm;
        FSomePar: integer;
    protected
        procedure Execute; override;
    public
        procedure AfterConstruction; override;
        destructor Destroy; override;
        property Owner: TForm read FOwner write FOwner;
        property SomePar: integer read FSomePar write FSomePar;
        property Event: TEvent read FEvent;
    end;

type

    { TForm2 }

    TForm2 = class(TForm)
        procedure FormCreate(Sender: TObject);
    private
        procedure WMTest(var Msg: TMessage); message WM_USER+1;
    public

    end;

var
    Form2: TForm2;

implementation

{$R *.lfm}

{ TForm2 }

procedure TForm2.FormCreate(Sender: TObject);
var t: TMyThread;
begin
    t := TMyThread.Create(false);
    t.Owner := Self;
    t.SomePar := 10;
    t.Event.SetEvent;
end;

procedure TForm2.WMTest(var Msg: TMessage);
begin
    // тут нам что-то сообщили
    Caption := 'Final!';
end;

{ TMyThread }

procedure TMyThread.Execute;
begin
    while not Terminated do begin
        if not Terminated then FEvent.WaitFor(INFINITE);
        if not Terminated then begin
            if SomePar = 10 then begin
                // тут работу работуем
                Sleep(1000);
                if Assigned(FOwner) then PostMessage(FOwner.Handle, WM_USER+1, 0, 0);
            end;
        end;
    end;
end;

procedure TMyThread.AfterConstruction;
begin
    inherited AfterConstruction;
    FEvent := TEvent.Create(nil, false, false, 'MyEvent');
end;

destructor TMyThread.Destroy;
begin
    Terminate;
    FEvent.SetEvent;
    Sleep(100);
    FEvent.Free;
    inherited Destroy;
end;

end.
1 ноя 18, 16:51    [21721765]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
wadman
Вот минимальный поток с доп. функционалом



К сообщению приложен файл. Размер - 81Kb
1 ноя 18, 21:11    [21721953]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
defecator
Member

Откуда:
Сообщений: 38865
Док
wadman
Вот минимальный поток с доп. функционалом



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

как человек, варивший трубы, скажу, что тут поработал Мастер
1 ноя 18, 21:28    [21721963]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
defecator
тут поработал Мастер

это кто-то оспаривает? ;)
1 ноя 18, 22:00    [21721987]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9647
Док
это кто-то оспаривает? ;)

Руки мастера, мозг ... Но тут надо историю знать :)
1 ноя 18, 22:39    [21722011]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
Док
wadman
Вот минимальный поток с доп. функционалом



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

Все будет проще, если код потока отделишь от формы. :)
1 ноя 18, 22:43    [21722013]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
alekcvp
Member

Откуда:
Сообщений: 1142
wadman
Вот минимальный поток с доп. функционалом:

А почему Sleep(100), а не 146, например?
1 ноя 18, 22:53    [21722019]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
alekcvp
Member

Откуда:
Сообщений: 1142
Это я к тому, что:

  ...
  while (FEvent.WaitFor(INFINITE) = wrSignaled) and not Terminated do begin
  ...

destructor TMyThread.Destroy;
begin
  FEvent.Free;
  inherited Destroy;
end;
1 ноя 18, 22:58    [21722020]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
alekcvp
wadman
Вот минимальный поток с доп. функционалом:

А почему Sleep(100), а не 146, например?

Пусть будет 146. Не проблема.
1 ноя 18, 22:58    [21722022]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Gator
Member

Откуда: Москва
Сообщений: 13910
wadman
Все будет проще, если код потока отделишь от формы. :)
А я всегда говорил, что форма (контролы) это витринка.
Процессору (мозгу) интересен ассемблер.

Иллюстрация у магазина:
- Экспозиция в витрине
- Вывеска
-- тупо нарисовано на картонке
-- железную конструкцию (типа железный сапог на цепях) ветер качает
...
2 ноя 18, 00:22    [21722048]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
wadman
Все будет проще, если код потока отделишь от формы. :)

мой код, написанный 10 лет назад, теперь у меня вызывает бурю негативных эмоций. А ты предлагаешь еще "отделять бизнес слой от ГУИ-шного" ©
+
[youtube=
Ссылка на позицию в клипе: http://youtu.be/ZZjLzZZZE38?t=59
]
2 ноя 18, 08:44    [21722108]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
Док
А ты предлагаешь еще "отделять бизнес слой от ГУИ-шного" ©

Предлагаю взять мою обертку и не париться. вместо батона кинул поток на форму, завел пару тасков и их обработчиков и всё!
2 ноя 18, 08:51    [21722114]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
defecator
Member

Откуда:
Сообщений: 38865
wadman
Док
А ты предлагаешь еще "отделять бизнес слой от ГУИ-шного" ©

Предлагаю взять мою обертку и не париться. вместо батона кинул поток на форму, завел пару тасков и их обработчиков и всё!

давай обёртку, мне надо
2 ноя 18, 09:01    [21722120]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
defecator
wadman
пропущено...

Предлагаю взять мою обертку и не париться. вместо батона кинул поток на форму, завел пару тасков и их обработчиков и всё!

давай обёртку, мне надо

Дак тут всё https://github.com/wadman/wthread
2 ноя 18, 09:10    [21722124]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
defecator
Member

Откуда:
Сообщений: 38865
wadman
defecator
пропущено...

давай обёртку, мне надо

Дак тут всё https://github.com/wadman/wthread

я забыл, где оно паслось
2 ноя 18, 09:20    [21722141]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
wadman
Предлагаю взять мою обертку и не париться.

надеюсь, на D2007 взлетит. Спасибо :)
2 ноя 18, 09:24    [21722144]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
Док
wadman
Предлагаю взять мою обертку и не париться.

надеюсь, на D2007 взлетит. Спасибо :)

Летает и на D7 и на 10.x и на маках, убунтах всяких.
2 ноя 18, 09:27    [21722149]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
defecator
Member

Откуда:
Сообщений: 38865
wadman
Док
пропущено...

надеюсь, на D2007 взлетит. Спасибо :)

Летает и на D7 и на 10.x и на маках, убунтах всяких.

хорошо наговнокодил, молодец !
Щаз буду юзать !
2 ноя 18, 09:28    [21722150]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24502
defecator
wadman
пропущено...

Летает и на D7 и на 10.x и на маках, убунтах всяких.

хорошо наговнокодил, молодец !
Щаз буду юзать !

2 ноя 18, 09:34    [21722156]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3479
Док
Наткнулся на непонятки в DX10.2.3_CE: если создать доп.поток приостановленным, например так:
constructor TMyThread.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
  FreeOnTerminate:= False;
  Priority:= tpLower;

  if Suspended then Start;
//  if Suspended then Resume;
end;

а затем запустить рекомендуемой процедурой Start, то получаем отлуп

Cannot call Start on a running or suspended thread.






Старый добрый Resume, показываемый в Code Insight серым цветом (deprecated же), запускает поток корректно. Я что-то пропустил?

я вообще не вижу смысла в твоём коде, делай просто
constructor TMyThread.Create();
begin
  inherited Create(False);
  FreeOnTerminate:= False;
  Priority:= tpLower;
end;
будет то же самое
2 ноя 18, 10:52    [21722248]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
vavan
Member

Откуда: Казань
Сообщений: 3163
defecator
как человек, варивший трубы, скажу, что тут поработал Мастер
+
мне когда на хате ремонт доделали и я уже заезжал, обнаружилось что дурит смеситель с термостатом в ванной, не работает, кипяток льет. выяснилось что монтажники-джамшуты кроме всего прочего и подводку в этом месте перепутали, а есть лишь небольшое ревизионное окошко и думал что придется ломать плитку, не успев заехать. благо спец именно по сантехнике сумел перепаять прям через эту маленькую дверцу
2 ноя 18, 11:55    [21722363]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
ziv-2014
Member

Откуда:
Сообщений: 147
wadman,
Как раз собирался искать :) Спасибо!
2 ноя 18, 14:23    [21722526]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
kealon(Ruslan)
я вообще не вижу смысла в твоём коде, делай просто
constructor TMyThread.Create();
begin
  inherited Create(False);
  FreeOnTerminate:= False;
  Priority:= tpLower;
end;

будет то же самое

В моём коде это имеет смысл. На, пробуй свои советы на практике :)

К сообщению приложен файл (test.7z - 10Kb) cкачать
2 ноя 18, 14:35    [21722539]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
s62
Member

Откуда: Жуковский
Сообщений: 846
Док
В моём коде это имеет смысл. На, пробуй свои советы на практике :)

Как я понимаю, неважно, создаем мы так
inherited Create(False)

или же так
inherited Create(True)

поток в конструкторе TThread.Create создается приостановленным и стартует (даже если в конструкторе наследника используется inherited Create(False) ) только после выполнения конструктора - в процедуре AfterConstruction. Поэтому все операторы и процедуры в конструкторе класса-наследника в любом случае выполнятся до того, как стартует поток.
Может я ошибаюсь, конечно, но по-моему это так.
2 ноя 18, 15:09    [21722587]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
s62
Member

Откуда: Жуковский
Сообщений: 846
s62,

s62
и стартует (даже если в конструкторе наследника используется inherited Create(False) ) только после выполнения конструктора - в процедуре AfterConstruction

Не даже если, а просто если.
2 ноя 18, 15:26    [21722605]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3621
Док
Наткнулся на непонятки в DX10.2.3_CE: если создать доп.поток приостановленным, например так:
constructor TMyThread.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
  FreeOnTerminate:= False;
  Priority:= tpLower;

  if Suspended then Start;
// if Suspended then Resume;
end;


а затем запустить рекомендуемой процедурой Start, то получаем отлуп

Cannot call Start on a running or suspended thread.



Старый добрый Resume, показываемый в Code Insight серым цветом (deprecated же), запускает поток корректно. Я что-то пропустил?
Правильно тебя посылает. Скорей всено, Start выполняет запуск потока, который запрещен в конструкторе. Передай False в параметр Suspended - и всё, никаких Resume не надо будет и все будет хорошо.
Suspended нужно для того, чтобы после конструктора но до запуска потока что-то изменить в объекте потока. Не твой случай.
2 ноя 18, 15:51    [21722635]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3621
wadman
Вот минимальный поток с доп. функционалом

wadman
procedure TMyThread.AfterConstruction;
begin
    inherited AfterConstruction;
    FEvent := TEvent.Create(nil, false, false, 'MyEvent');
end;

destructor TMyThread.Destroy;
begin
    Terminate;
    FEvent.SetEvent;
    Sleep(100);
    FEvent.Free;
    inherited Destroy;
end;

Брррр.
Надо хоть так:

procedure TMyThread.AfterConstruction;
begin
    FEvent := TEvent.Create(nil, false, false, 'MyEvent');
    inherited AfterConstruction;
end;

destructor TMyThread.Destroy;
begin
    Terminate;
    FEvent.SetEvent;
    inherited Destroy;
    FEvent.Free;
end;
2 ноя 18, 15:55    [21722640]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
YuRock
Member

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

А еще желательно в деструкторе проверять на Assigned( FEvent ), если в конструкторе возможны исключения.
2 ноя 18, 15:57    [21722642]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
YuRock
Скорей всено, Start выполняет запуск потока, который запрещен в конструкторе.

Абсолютно верно. На Tokyo Start разрешен только в основном потоке, а вот в Лазарусе - везде(и в конструкторе, и в основном потоке).

И, теперь вижу, что это правильно: ибо, если создать поток так
    try
      fThread:= TMyThread.Create(True);
      try
        frmSplash:= TfrmSplash.Create(Self);
//        if fThread.Suspended then fThread.Start;
        frmSplash.ShowModal;
      finally
        FreeAndNil(frmSplash);
      end;

      frmChild.ShowModal;
    finally
      FreeAndNil(fThread);
    end;

, но "забыть" стартануть его, то код в основном потоке продолжится дальше без выполнения fThread.Execute. А вот это уже фэйл :)

YuRock
Передай False в параметр Suspended - и всё, никаких Resume не надо будет и все будет хорошо.

Я это делаю намеренно: мне нужно быть точно уверенным, что некоторые переменные будут инициализированы в конструкторе ДО запуска доп.потока
2 ноя 18, 21:58    [21723006]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1164
Вообще не понимаю смысла приостановленных нитей. Они ж нужны чтобы выполнить работу в определенный момент времени. А если надо пауза, то это дело объектов синхронизации.
2 ноя 18, 22:06    [21723011]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
alekcvp
Member

Откуда:
Сообщений: 1142
Док
Я это делаю намеренно: мне нужно быть точно уверенным, что некоторые переменные будут инициализированы в конструкторе ДО запуска доп.потока

Независимо от параметра - ВСЕ переменные будут инициализированы в конструкторе ДО запуска потока.
2 ноя 18, 22:44    [21723041]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
alekcvp
ВСЕ переменные будут инициализированы в конструкторе ДО запуска потока

это описано в доке или просто твоя уверенность?
2 ноя 18, 23:23    [21723070]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
Я чуть выше неточно выразился: мне инициализировать некоторые переменные ДО запуска, но не только в конструкторе (например, frmSplash в коде выше).
2 ноя 18, 23:40    [21723088]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3621
Док
alekcvp
ВСЕ переменные будут инициализированы в конструкторе ДО запуска потока

это описано в доке или просто твоя уверенность?
Да, но ищи сам. Главное, это описано в исходниках класса TThread - запуск потока происходит в AfterConatruction.
2 ноя 18, 23:55    [21723098]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3621
Док
Я чуть выше неточно выразился: мне инициализировать некоторые переменные ДО запуска, но не только в конструкторе (например, frmSplash в коде выше).
Тогда да, надо. Но тогда и Start должен сработать.
2 ноя 18, 23:56    [21723100]     Ответить | Цитировать Сообщить модератору
 Re: Вызов Start для приостановленного потока  [new]
Док
Member

Откуда: Казань
Сообщений: 5840
YuRock
это описано в исходниках класса TThread - запуск потока происходит в AfterConatruction

в справке тоже об этом сказано. По коду, оба метода: и Start, и AfterConstruction вызывают InternalStart, только с разными параметрами. Так что, про "все в конструкторе инициализируется ДО" Execute доп.потока - это я просто сам не догадался :)

Познавательно, однако...
3 ноя 18, 00:49    [21723119]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить