Текущий архив: 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