Конференция "FreePascal" » Многопоточное консольное приложение uses crt+write+TThread=Глюк? [Win32, linux]
 
  • Fredy314 © (09.09.10 14:02) [0]
    делаю кросплатворменную программу на 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 просто перестает выводить текст на екран.
  • Pavia © (07.01.11 00:41) [1]
    Выводом должен заниматься один поток. Ли боже использовать светофор.
  • Alex Konshin © (18.02.11 05:52) [2]
    Я подозреваю, что нужно делать flush. Ну и синхронизация нужна.
  • thaddy © (27.04.11 17:08) [3]
    Writeln uses stdin/out/err, which is are threadvars in FPC ???.
    In Delphi, writeln is threadsafe (and synchronised) in Freepascal it is not, because the developers seem to think there should be more than one STANDARD out/in/err.
    Don't ask why.... (No other language has this "feature")
    So you run into the same trouble as I did.
 
Конференция "FreePascal" » Многопоточное консольное приложение uses crt+write+TThread=Глюк? [Win32, linux]
Есть новые Нет новых   [134427   +38][b:0][p:0.001]