![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
В чем можеть быть проблема с потоками
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]Ошибка выскакивает, когда работают потоки, или когда их пытаешься терминировать?