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

Вниз

Можно ли свободно использовать TStringList в разных потоках?   Найти похожие ветки 

 
S@shka ©   (2004-01-03 15:39) [0]

В основном потоке программы создается TStringList;
который периодически наполняется sl.Add ();
Есть второй поток TThread2 = class (TThread) в нем
StringList периодичекси последовательно очищается.
Можно ли без всяких synchronize использовать StringList в данном режиме? Не возникнет ли сбоя ???


 
jack128 ©   (2004-01-03 15:57) [1]

Возможны сбои, так что лудше обрамить в synchronize..


 
S@shka ©   (2004-01-03 17:05) [2]

Точно ли это???
В частности ....
ссылаясь на Delphi 4. Энциклопедия пользователя Ч. Калверт
"... компноненты TStrings, TStringList не являются потомками TComponent, а потому могут свободно использоваться в потоках..."


 
Jack128 ©   (2004-01-03 20:50) [3]

уж не незнаю, кто что там говорит, но если я в одном потоке выделю память под новую строку, в другом её освобожу, а в первом попытаюсь записать что либо в уже освобожденную память, то будет не очень хорошо. Согласен?


 
Ломброзо ©   (2004-01-03 21:20) [4]

имхо потенциально даже операция i := 0 при многопоточной работе может дать вовсе не 0, так что примитивы синхронизации смелее надо использовать.


 
S@shka ©   (2004-01-03 22:09) [5]

Странно почему то у меня не сбоит вот такой код
....
type
ThRead1 = class (TTHread)
private
FCounter : Integer;
FName : String;
FSleepTime : Integer;
procedure Done;
public
constructor Create (Name : String; SleepTime : Integer);
procedure Execute; override;
end;

ThRead3 = class (TTHread)
private
procedure Done;
public
constructor Create;
procedure Execute; override;
end;

TForm1 = class(TForm)
....
end;

var
Form1: TForm1;
sl : TStringList;
t1,t2 : Thread1;
t3 : Thread3;
Counter : Integer = 0;
implementation

{$R *.dfm}

{ ThRead1 }

constructor ThRead1.Create (Name : String; SleepTime : Integer);
begin
inherited Create (True);
FreeOnTerminate := True;
FCounter := 0;
FName := Name;
FSleepTime := SleepTime;
end;

procedure ThRead1.Done;
begin
Form1.Memo1.Lines.Add(FName + ". Done");
end;

procedure ThRead1.Execute;
begin
while (not Terminated) do
begin
sl.Add(IntToStr(FCounter) + " " + FName);
Inc (FCounter);
sleep (random (FSleepTime));
end;
Synchronize (Done);
end;

{ ThRead3 }

constructor ThRead3.Create;
begin
inherited Create (True);
FreeOnTerminate := True;
end;

procedure ThRead3.Done;
begin
Form1.Memo1.Lines.Add("Thread 3. Done");
end;

procedure ThRead3.Execute;
var
i,j : Integer;
F : Text;
begin
while (not Terminated) do
begin
try
j := sl.Count;
if (j > 0) then
begin
assignfile (F,"thread.txt");
if (FileExists("thread.txt")) then append (F)
else Rewrite (F);
for i := 0 to (j-1) do writeln (F,sl.Strings[i]);
for i := 0 to (j-1) do sl.Delete(0);
end;
except on E:Exception do
begin
writeln (F,"Error : " +E.Message);
j := 1; // :)
end;
end;
if (j > 0) then closefile (F);
sleep (1000);
end;
Synchronize (Done);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
T1 := Thread1.Create ("Thread1",200);
T2 := Thread1.Create ("Thread2",100);
T3 := Thread3.Create;
sl := TStringList.Create;
Timer1.Enabled := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
T1.Resume;
T2.Resume;
T3.Resume;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
T1.Terminate;
T2.Terminate;
T3.Terminate;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := false;
sl.Add(IntToStr (Counter) + " Timer1 Add");
inc (Counter);
Timer1.Enabled := true;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
sl.Free;
end;

end.


 
S@shka ©   (2004-01-03 22:12) [6]

И все числа в текстовом файле записаны по возрастующей
(то есть как и должны быть)
Пример...
0 Timer1 Add
0 Thread1
0 Thread2
1 Thread2
2 Thread2
1 Thread1
3 Thread2
2 Thread1
4 Thread2
3 Thread1
5 Thread2
6 Thread2
4 Thread1
7 Thread2
8 Thread2
5 Thread1
9 Thread2
10 Thread2
6 Thread1
7 Thread1
11 Thread2
12 Thread2


 
Vuk ©   (2004-01-03 22:34) [7]

Для работы с одним объектом из разных потоков используйте критические секции (TCriticalSection).


 
Jack128 ©   (2004-01-03 23:13) [8]


> Странно почему то у меня не сбоит вот такой код

Потому что ошибки из-за многопоточности - это такие ошибки, которые вылезают не на этапе тестирования, а на этапе эксплотации ;-)



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

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

Наверх




Память: 0.49 MB
Время: 0.03 c
1-49480
anbezr
2004-01-06 13:20
2004.01.16
непонятный глюк редактора.


1-49595
ИМХО
2004-01-03 20:36
2004.01.16
Excel и Access


3-49413
MakNik
2003-12-19 10:29
2004.01.16
SQL


6-49654
Alex_x
2003-11-17 13:30
2004.01.16
Нужно узнать доступенли комп в сети с заданым именем


14-49697
panov
2003-12-19 21:31
2004.01.16
Надоел спам.