Форум: "Начинающим";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
ВнизВ чем можеть быть проблема с потоками Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.073 c