|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Beginthread -> CloseHandle memory leak
Пытаюсь сделать поток такого типа.
Но при выходе (ThreadTerminate->CloseHandle)всегда образуется утечка памяти. Как правильно высвободить поток в этом случае? Подскажите что не так ? СПС. Код внизу... Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,SyncObjs; procedure incedit1;stdcall; procedure incedit2;stdcall; type TForm1 = class(TForm) Begin_Threads_: TButton; Edit1: TEdit; Edit2: TEdit; Terminatethread1: TButton; terminatethread2: TButton; SuspendThread_h1: TButton; SuspendThread2: TButton; Resumethread_2: TButton; resumethread1: TButton; EndThread_: TButton; procedure Begin_Threads_Click(Sender: TObject); procedure Terminatethread1Click(Sender: TObject); procedure terminatethread2Click(Sender: TObject); procedure resumethread1Click(Sender: TObject); procedure Resumethread_2Click(Sender: TObject); procedure SuspendThread_h1Click(Sender: TObject); procedure SuspendThread2Click(Sender: TObject); procedure EndThread_Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1 : TForm1; CritSec,CritSec1 : TCriticalSection; // Critical section variable implementation var th1,th2 : LongWord; h1,h2 : integer; procedure incedit1; var i:integer; begin i:=0; while true do begin CritSec.Enter; form1.edit1.text:=inttostr(i); i:=i+1; CritSec.Leave; end; end; procedure incedit2; var i:integer; begin i:=0; while true do begin CritSec1.Enter; form1.edit2.text:=inttostr(i); i:=i+1; CritSec1.Leave; end; end; {$R *.DFM} procedure TForm1.Begin_Threads_Click(Sender: TObject); begin h1:=beginthread(nil,1024,@incedit1,nil,0,th1); h2:=beginthread(nil,1024,@incedit2,nil,0,th2); end; procedure TForm1.Terminatethread1Click(Sender: TObject); begin terminatethread(h1,1); end; procedure TForm1.terminatethread2Click(Sender: TObject); begin terminatethread(h2,1); end; procedure TForm1.resumethread1Click(Sender: TObject); begin resumethread(h1); end; procedure TForm1.Resumethread_2Click(Sender: TObject); begin resumethread(h2); end; procedure TForm1.SuspendThread_h1Click(Sender: TObject); begin suspendthread(h1); end; procedure TForm1.SuspendThread2Click(Sender: TObject); begin suspendthread(h2); end; procedure TForm1.EndThread_Click(Sender: TObject); begin EndThread(h1); // EndThread(h2); // Closethread(h1); // Closethread(h2); CloseHandle(h1); CloseHandle(h2); end; procedure TForm1.FormCreate(Sender: TObject); begin CritSec:=TCriticalSection.Create; CritSec1:=TCriticalSection.Create; end; procedure TForm1.FormDestroy(Sender: TObject); begin CritSec.Free; CritSec1.Free; end; end. lmikle: пользуемся тегами. Последний раз редактировалось lmikle, 28.05.2013 в 06:10. |
#2
|
||||
|
||||
используй флаг (Boolean переменная) прерывания потока для цикла. TerminateThread не используй никогда. EndThread должна находиться в функции потока - после нее поток (выполнение функции потока) завершается.
не обращайся напрямую к VCL объектам из потока, критические секции тут не помогут. обращаться к ним можно только из основного потока. смотри этот механизм у TThread или сразу используй его. Пишу программы за еду. __________________ |