Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

В чем можеть быть проблема с потоками


dabreezy ©   (2006-01-12 11:24:00) 

Ситуация такая есть следующий код, он работает, а потом оп и ошибка выскакивает: EInvalidPointer причем иногда долго работает а иногда нет.
Если потоков сделать >10 то вообще почти сразу вываливается ошибка
Спасибо за ответ.

type
 TMyThread1 = class(TThread)
  private
    { Private declarations }
  protected
    procedure DoWork;
    procedure Execute; override;
  end;

 TForm1 = class(TForm)
   Edit1: TEdit;
   Button2: TButton;
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
     a: array of string;
     b: array of byte;
     li: integer;
     T1: array [1..4] of TMyThread1;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
text_t: string;

implementation

{$R *.dfm}

procedure TMyThread1.DoWork;
begin
 Form1.edit1.text:=text_t;
end;

procedure TMyThread1.Execute;
var
i: integer;
begin
 randomize;
repeat
 text_t:='';
 for i:=1 to 10 do
   text_t:=text_t+inttostr(random(10));
 synchronize(dowork);
until terminated;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 i: byte;
begin
 if button2.Caption='Start' then
   begin
     for i:=1 to 4 do
     T1[i] := TMyThread1.Create(False);
     button2.caption:='Stop';
   end
 else
   begin
     for i:=1 to 4 do
       T1[i].Terminate;
     button2.Caption:='Start';
   end;

end;

end.


evvcom   (2006-01-12 12:11:00) [1]


> Архангельского начитался? ;о)))

Блин, никогда не читал. Неужели такие глупости в книгах пишут? Да... ну и учителя пошли... бедные дети...


sniknik   (2006-01-12 12:08:00) [2]

AbrosimovA   (12.01.06 11:58) [5]
Архангельского начитался? ;о)))


evvcom   (2006-01-12 12:08:00) [3]


> AbrosimovA   (12.01.06 11:58) [5]
> Сделай следующим образом:

А смысл создавать отдельный поток, если его код целиком будет выполняться в основном потоке? :-)


Johnmen   (2006-01-12 11:59:00) [4]

Вот-вот, пишется, не синхронизируясь...:)


AbrosimovA   (2006-01-12 11:58:00) [5]

Сделай следующим образом:

procedure TMyThread1.DoWork;
var i: integer;
begin
randomize;
repeat
text_t:='';
Application.ProcessMessages;
for i:=1 to 10 do begin
  text_t:=text_t+inttostr(random(10));
  Form1.edit1.text:=text_t;
end;
until terminated;

end;

procedure TMyThread1.Execute;
begin
 synchronize(dowork);
end;


sniknik   (2006-01-12 11:56:00) [6]

(причем возможенэто слишком мягко сказано ;)


sniknik   (2006-01-12 11:55:00) [7]

> var
>  Form1: TForm1;
>   text_t: string;
это лучше сделать переменной класса TMyThread1. глюк возможен изза этого.


evvcom   (2006-01-12 11:55:00) [8]


>  text_t:='';
>  for i:=1 to 10 do
>    text_t:=text_t+inttostr(random(10));

Ну так ты читаешь/пишешь глобальную переменную не синхронизируясь совсем.


Johnmen   (2006-01-12 11:51:00) [9]

Ошибка выскакивает, когда работают потоки, или когда их пытаешься терминировать?


Наверх

Титульная страница Поиск, карта сайта Написать письмо