Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Tthread Синхронайз не выводит в консоль / 4 сообщений из 4, страница 1 из 1
24.03.2021, 22:13
    #40056732
Ildar007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tthread Синхронайз не выводит в консоль
Доброго времени суток товарищи. Что я сделал не так с синъронайзом, не выводит на консоль.
Также вопрос, как контролировать количество создаваемых потоков.

Код: 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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  System.Classes,
  Winapi.Windows,
  System.Threading;


type
  TOneClassTthread = class(TThread)
  protected
    procedure Execute; override;
  end;



var
  SI: TSystemInfo;
  Count: Cardinal;
  MyArrayThread: array [0..3] of TOneClassTthread;
  I: Integer;
  A: Integer;
{ TOneClassTthread }

procedure TOneClassTthread.Execute;
begin
  inherited
  sleep(200);
  A := A + 1;
  //Terminate;
  Synchronize(procedure
  begin
    Writeln('qewe')
  end);

end;

begin
  try
    { TODO -oUser -cConsole Main : Insert code here }

    // определить количество ядер процессора
    GetSystemInfo(SI);
    Writeln(IntToStr(Count));

    // ограничение максимального количества потоков

    TThreadPool.Default.SetMaxWorkerThreads(2*Count);
    Writeln(IntToStr(2*Count));

    // создание потоков

    A:= 0;

    for I := 0 to High(MyArrayThread) do
    begin
      MyArrayThread[i] := TOneClassTthread.Create(True);
      MyArrayThread[i].Priority := tpNormal;

    end;

    for I := 0 to High(MyArrayThread) do
    begin
      MyArrayThread[i].Start;
    end;


  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

  end.
...
Рейтинг: 0 / 0
24.03.2021, 22:39
    #40056736
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tthread Синхронайз не выводит в консоль
Ildar007,

Всё ты сделал правильно. Synchronize просто не работает в консоли (как и еще много где).
Разве что можешь придумать какой-нибудь костыльный цикл в главном потоке и вызывать в нем вручную CheckSynchronize.
...
Рейтинг: 0 / 0
24.03.2021, 22:53
    #40056738
zedxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tthread Синхронайз не выводит в консоль
Ildar007,

Sychronize применим только если вы хотите взаимодействовать с VCL. В консольном приложении вы можете использовать обычные критические секции, для защиты ресурсов от конкурентного доступа.
...
Рейтинг: 0 / 0
24.03.2021, 23:02
    #40056739
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tthread Синхронайз не выводит в консоль
Ildar007
Что я сделал не так с синъронайзом, не выводит на консоль.
Все.

1. Вы не дожидаетесь завершения потоков. У вас приложение может завершиться до того, как поток что-то выведет на экран.
2. Вы не проверяете очередь Synchronize CheckSynchronize It is not necessary to call CheckSynchronize in a GUI application. The call to CheckSynchronize is made automatically by the application object. In a non-GUI application, you must call CheckSynchronize if you use the Synchronize method of TThread. To do this, set the WakeMainThread variable to a procedure that calls CheckSynchronize.3. TThreadPool это вообще не про то

Ildar007
Также вопрос, как контролировать количество создаваемых потоков.
Создавать столько потоков сколько нужно
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Tthread Синхронайз не выводит в консоль / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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