Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Многопоточное консольное приложение


Автор: Fredy314 9.9.2010, 12:17
делаю кросплатворменную программу на FreePascal, которая в нескольких потоках должна что-то делать.
Проблема с выводом статистики
Если потоки просто делают writeln(Номер потока+текст сообщения) //С синхронизацией само собой
все вроде работает, только строки постоянно ползут вверх вперемешку от всех потоков.
Хотел искользово crt+gotoXY чтобы каждый поток выводил в своей строке, но ничего не выводится.
без потоков gotoXY и writeln выводит все нормально и в виндовс и скомпилированое под линукс работает нормально, а если к многопоточной программе просто подключить модуль crt, то все  writeln просто выводят пустоту только курсор дергается.
Код

{$APPTYPE CONSOLE}
{$MODE objfpc}{$H+}
uses RunThread;
var Threads:array of TRunThread;
i:Integer;
begin
  setLength(Threads,10);
  for i:=0 to 9 do
    Threads[i]:=TRunThread.create(i+1);
  Threads[0].WaitFor;
WriteLn;
end.

Код

unit RunThread;
interface
{$MODE objfpc}{$H+}
uses {$IFDEF unix}cthreads, cmem, {$ENDIF}Classes, SysUtils;
type TRunThread=class(TThread)
    Y:Integer;
    procedure Execute; override;
    constructor Create(aY:Integer);
    procedure UpdateTime;
end;
implementation

constructor TRunThread.Create(aY:Integer);
  begin
    inherited Create(False);
    Y:=aY;
  end;
procedure TRunThread.Execute;
  begin
    while not Terminated do
    begin
      sleep(500+random(500));
      Synchronize(@UpdateTime);
    end;
  end;
procedure TRunThread.UpdateTime;
var s:String;
  Begin
    DateTimeToString(s, 'dd/mm/yyyyy h:m:s.z', now);
    Writeln(Y,':',s);
  end;
end.

Вот так работает, а если добавить в uses crt для unit RunThread просто перестает выводить текст на екран.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)