Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Что-то непонятное в выводе многопоточной проги / 4 сообщений из 4, страница 1 из 1
31.10.2017, 11:14:04
    #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
31.10.2017, 11:19:39
    #39545103
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то непонятное в выводе многопоточной проги
MikhalichПочему первый поток в начале выводит по две одинаковой строки?
writeln не потокобезопасная.
...
Рейтинг: 0 / 0
31.10.2017, 11:23:04
    #39545107
Mikhalich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то непонятное в выводе многопоточной проги
wadmanwriteln не потокобезопасная.
вот гадость.....
...
Рейтинг: 0 / 0
31.10.2017, 13:37:20
    #39545220
krapotkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то непонятное в выводе многопоточной проги
и использование класса TThread а в нем обращаться к proc1, а в ней к threadvar.
Не слишком сложненько???
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Что-то непонятное в выводе многопоточной проги / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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