IPB
ЛогинПароль:

> Класс Thread
Altair
сообщение 4.02.2005 22:25
Сообщение #1


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Компилирую программу:

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

почему?


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 7)
Altair
сообщение 4.02.2005 22:54
Сообщение #2


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


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

http://pascal.dax.ru/forum/oleg_z/prog/thread.zip


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.02.2005 16:45
Сообщение #3


Гость






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
сообщение 5.02.2005 17:03
Сообщение #4


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Программа не работает... пробовал аналогично делать.

Найденный супер глюк:
если написать
{$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 зависает)


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
trminator
сообщение 5.02.2005 17:08
Сообщение #5


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


Поддержка TThread.Synchronize заявлена как новая возможность в FPC 1.9.6... а у народа обычно 1.0.10...

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

В общем, у меня такое чувство, что этот Synchronize как бы и не обязан работать...


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 5.02.2005 17:09
Сообщение #6


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


ставим после write(ch) delay(1) и все работет как часы, и при нажатии клавиш в том числе...
но медленно, следовательно цель не достигнута...


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 5.02.2005 17:22
Сообщение #7


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Все, модернизировал пример, он работает.
Идея : проверять произошла ли ошика, если произошла, то процесс автоматически остановиться, а мы его заново создадим.
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 тоже работает!!!!


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 5.02.2005 20:15
Сообщение #8


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Итоговый вариант:
(в предыдущем в следствии создания новых процессов все время размер памяти увеличивался занятый программой)

заменить
inherited Create(false);
на Resume


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 27.07.2025 4:26
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"