Помощь - Поиск - Пользователи - Календарь
Полная версия: Класс Thread
Форум «Всё о Паскале» > Pascal, Object Pascal > 32 битные компиляторы
Altair
Компилирую программу:

program testthreads;

{$mode objfpc}

uses
sysutils,
classes;

type
TMyThread=class(TThread)
private
ch : char;
protected
procedure Execute; override;
public
constructor Create(c:char);
end;

procedure TMyThread.Execute;
begin
repeat
write(ch);
until Terminated;
end;


constructor TMyThread.Create(c:char);
begin
ch:=c;
inherited Create(false);
end;

var
t1,t2 : TMyThread;
begin
t1:=TMyThread.Create('a');
t2:=TMyThread.Create('b');
readln;
t2.Terminate;
readln;
t1.Terminate;
readln;
t2.Destroy;
t1.Destroy;
end.


При запуске секунды 3-4 работает как надо, потом ошибка
Error, DISC FULL
И вылетает.
Компилятор FPC.

То-же самое делаю на Delphi, все идеально!

+ в FPC когда прога еще работает, если нажать на клавишу, то прога вылетит. sad.gif

почему?
Altair
вот отсюда можно скачать архив, с 2 прогами - одна на Дельфи 0 рабочая, другая глюченная на FPC.

http://pascal.dax.ru/forum/oleg_z/prog/thread.zip
volvo
Oleg_Z
Попробуй использовать TThread.Synchronize:
type
TMyThread=class(TThread)
private
ch : char;
protected
procedure Execute; override;
procedure ShowIt;
public
constructor Create(c:char);
end;

procedure TMyThread.ShowIt;
begin
write(ch)
end;

procedure TMyThread.Execute;
begin
repeat
synchronize(ShowIt)
until Terminated;
end;


constructor TMyThread.Create(c:char);
begin
ch:=c;
inherited Create(false);
end;

var
t1,t2 : TMyThread;
begin
t1:=TMyThread.Create('a');
t2:=TMyThread.Create('b');
readln;
t2.Terminate;
readln;
t1.Terminate;
readln;
t2.Destroy;
t1.Destroy;
end.
Altair
Программа не работает... пробовал аналогично делать.

Найденный супер глюк:
если написать
{$mode objfpc}
uses ...

то при компиляции появиться ошибка:
 Error: Incompatible type for arg no. 1: Got VOID, expected <procedure variable type of procedure() of object;>


а если

uses ...
{$mode objfpc}



То все отлично компилируется, но не работает (на экран ничего не выводится, при нажатии 3 раза Enter зависает)
trminator
Поддержка TThread.Synchronize заявлена как новая возможность в FPC 1.9.6... а у народа обычно 1.0.10...

Хотя в исходниках метод Synchronize есть.

В общем, у меня такое чувство, что этот Synchronize как бы и не обязан работать...
Altair
ставим после write(ch) delay(1) и все работет как часы, и при нажатии клавиш в том числе...
но медленно, следовательно цель не достигнута...
Altair
Все, модернизировал пример, он работает.
Идея : проверять произошла ли ошика, если произошла, то процесс автоматически остановиться, а мы его заново создадим.
uses
 sysutils,
 classes,windows,wincrt;
var b:byte;
{$mode objfpc}
type
 TMyThread=class(TThread)
 private
   ch : char;
 protected

procedure Execute; override;
 public
   constructor Create(c:char);

 end;

procedure TMyThread.Execute;
begin
 repeat
   {$I-} write(ch);{$I+}
   If Ioresult<> 0 then  begin   inherited Create(false);end
 until Terminated;
end;


constructor TMyThread.Create(c:char);
begin
 ch:=c;
 inherited Create(false);
end;

var
 t1,t2 : TMyThread;
begin
 b:=1;
 t1:=TMyThread.Create('a');
 t2:=TMyThread.Create('b');

 readln;
 t2.Terminate;
 readln;
 t1.Terminate;
 readln;
 t2.Destroy;
 t1.Destroy;
end.


Работает как часы хоть сутки. Обработка ReadLn тоже работает!!!!
Altair
Итоговый вариант:
(в предыдущем в следствии создания новых процессов все время размер памяти увеличивался занятый программой)

заменить
inherited Create(false);
на Resume
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.