Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.29;
Скачать: CL | DM;

Вниз

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

 
dabreezy   (2006-01-12 11:24) [0]

Ситуация такая есть следующий код, он работает, а потом оп и ошибка выскакивает: 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.


 
Johnmen ©   (2006-01-12 11:51) [1]

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


 
sniknik ©   (2006-01-12 11:55) [2]

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


 
evvcom ©   (2006-01-12 11:55) [3]


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

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


 
sniknik ©   (2006-01-12 11:56) [4]

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


 
AbrosimovA   (2006-01-12 11:58) [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;


 
Johnmen ©   (2006-01-12 11:59) [6]

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


 
sniknik ©   (2006-01-12 12:08) [7]

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


 
evvcom ©   (2006-01-12 12:08) [8]


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

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


 
evvcom ©   (2006-01-12 12:11) [9]


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.01.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.042 c
1-1134447027
pepper
2005-12-13 07:10
2006.01.29
Динамическая загрузка mht файла в WebBrowser


2-1136903460
@gent
2006-01-10 17:31
2006.01.29
Форма одна или много ?


15-1136460887
tim@eclear.net
2006-01-05 14:34
2006.01.29
Wanted - Delphi Developers in moscow


2-1137096976
tech
2006-01-12 23:16
2006.01.29
Неясна причина ошибки


15-1136658189
(CHALING 32)S K i N E R
2006-01-07 21:23
2006.01.29
Обновления это хорошо но не всегда!