FreeOnTerminate поставь true; Все нормально заканчивается.... MyThread := TMyThread.Create(True); В Execute While (not terminated) do Form1.Memo1.Lines.Add('Working'); И код уничтожения MyThread.Terminate;
Code: var thr: array [1..100] of TNew; procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin for i:=1 to SpinEdit1.Value do begin TerminateThread(thr[i].Handle); thr[i].Free; end; SetLength(thr, 0); end; Решение "в лоб". Потоки гарантиоввнно убьются. Но если у тебя в теле потока будут не освобожденные ресурсы - словишь утечку памяти.
Есть программа которая копирует с Memo2 в Memo1 n-ое количество строк, пока Memo2.lines.Count=0 . Вот что получилось: Code: procedure TNewThread.Int; begin s:=copy(Form1.Memo2.Lines[0],1,15); Form1.Memo2.Lines.Delete(0); end; procedure TNewThread.Out; begin Form1.Memo1.Lines.Add(s); end; procedure TNewThread.Execute; begin while not Terminated do begin Synchronize(Int); Synchronize(Out); if Form1.Memo2.Lines.Count=0 then begin Terminate; end; end; end; При запуске в 1 поток он копирует на 1 символ больше. При запуске в 2 потока он копирует на 2 символ больше. и так далее. То есть когда Memo2.Lines.Count=0 он завершает все потоки, но они проходят цикл еще по 1 разу и только после этого завершаются. Как это исправить? Вот сама программа+исходники TThread Будет очень полезна для тех кто только начинает изучать потоки!
утечку памяти ты и так словиш потому что система не освобождает память из под стеков потоков прибитых через TerminateThread
Ты прав, но не совсем - стек освободится, а вот все что выделено в куче нет. Но в любом случае это решение для крайних ситуаций
При работе с большим количеством строк в несколько потоков возникает проблема: Форма программы зависает, но сама программа работает. Как это исправить?
Она и так в отдельном потоке у него Вообще не в тему. В данной ситуации все проще и трагичнее. Все вызовы Synchronize выполняются в контексте основного потока. У тебя слишком много и слишком часто вызываются синхронизации, поэтому поток просто "забивается" этими вызовами. Выхода здесь два: 1. Вставь в потоке перед вызовом синхронизаций Sleep(Random(20)), это разгрузит основной поток, но снизит производительность. 2. просто забей. В реальном приложении, когда синхронизации будут вызываться не так часто, этот эфеект не проявится.