Главная страница
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.047 c
15-1136289259
Loginov Dmitry
2006-01-03 14:54
2006.01.29
Matrix Reloading Alpha :)


8-1124396091
big
2005-08-19 00:14
2006.01.29
по ссылке см. верхнюю картинку


1-1135656881
Alex_V
2005-12-27 07:14
2006.01.29
и все же хотелось выяснить


2-1137178412
tech
2006-01-13 21:53
2006.01.29
Мастера, поделитесь опытом!


4-1132037793
rusgl
2005-11-15 09:56
2006.01.29
Можно ли как-нить установить HOOK на реестр?