powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Что-то непонятное в выводе многопоточной проги
4 сообщений из 4, страница 1 из 1
Что-то непонятное в выводе многопоточной проги
    #39545101
Mikhalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Простейшая прога в две строки.
Основной модуль:
Код: 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.
program proba01;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Thread1Unit in 'Thread1Unit.pas';

var
  Thread1: TThread1;
  Thread2: TThread1;
begin
  try
    Randomize;

    WriteLn('==========================');

    Thread1 := TThread1.Create(True);
    Thread1.FreeOnTerminate := False;
    Thread2 := TThread1.Create(True);
    Thread2.FreeOnTerminate := False;

    Thread1.Start;
    Thread2.Start;

    Thread1.WaitFor;
    Thread2.WaitFor;

    Thread1.Free;
    Thread2.Free;

    WriteLn('==========================');

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



Модуль потока:
Код: 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.
unit Thread1Unit;

interface

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

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

implementation

threadvar
  ThreadStr: String;
  ThreadIdx: Integer;

procedure Proc1(Self: Pointer);
var
  _Add: Boolean;
  _S: String;
begin
  _Add := False;
  if ThreadStr = '' then
  begin
    _Add := True;
    ThreadStr := 'id: ' + UIntToStr(GetCurrentThreadId);
  end;
  if _Add then _S := ThreadStr + ' +++' else _S := ThreadStr;
  UniqueString(_S);
  Inc(ThreadIdx);
  _S := FormatDateTime('mm:ss.zzz'#9, Now) + 'Self: ' + IntToHex(UIntPtr(Self), 8) + #9 + _S + ' - ' + IntToStr(ThreadIdx);
  WriteLn(_S);
end;

procedure TThread1.Execute;
var
  I: Integer;
begin
  ThreadStr := '';
  ThreadIdx := 0;

  Proc1(Self);
  Sleep(3000);

  for I := 1 to 5 do
  begin
    Proc1(Self);
    Sleep(Random(500));
  end;

  ThreadStr := '';
end;

end.



Вывод проги:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
==========================
10:01.091       Self: 00706768  id: 8868 +++ - 1
10:01.091       Self: 00706768  id: 8868 +++ - 1
10:01.091       Self: 007067B0  id: 1124 +++ - 1
10:04.092       Self: 00706768  id: 8868 - 2
10:04.092       Self: 00706768  id: 8868 - 2
10:04.092       Self: 007067B0  id: 1124 - 2
10:04.232       Self: 00706768  id: 8868 - 3
10:04.489       Self: 00706768  id: 8868 - 4
10:04.501       Self: 007067B0  id: 1124 - 3
10:04.518       Self: 00706768  id: 8868 - 5
10:04.745       Self: 007067B0  id: 1124 - 4
10:04.773       Self: 00706768  id: 8868 - 6
10:05.137       Self: 007067B0  id: 1124 - 5
10:05.625       Self: 007067B0  id: 1124 - 6
==========================

Почему первый поток в начале выводит по две одинаковой строки?
...
Рейтинг: 0 / 0
Что-то непонятное в выводе многопоточной проги
    #39545103
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikhalichПочему первый поток в начале выводит по две одинаковой строки?
writeln не потокобезопасная.
...
Рейтинг: 0 / 0
Что-то непонятное в выводе многопоточной проги
    #39545107
Mikhalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadmanwriteln не потокобезопасная.
вот гадость.....
...
Рейтинг: 0 / 0
Что-то непонятное в выводе многопоточной проги
    #39545220
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и использование класса TThread а в нем обращаться к proc1, а в ней к threadvar.
Не слишком сложненько???
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Что-то непонятное в выводе многопоточной проги
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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