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

> 

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Класс Thread
сообщение
Сообщение #1


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

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

Репутация: -  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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


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

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

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


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

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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


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

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

Репутация: -  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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


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

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

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


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

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

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


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


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

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

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


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


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


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

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

Репутация: -  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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


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

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

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


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

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


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

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

 





- Текстовая версия 19.04.2024 2:26
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name