![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемы с выделением памяти в потоках [D7, WinXP]
Павел И © (2006-09-17 21:08:00)Здравствуйте - такой вопрос
при работе с функциями
GetMem и FreeMem в разных потоках возникает ошибка OutOfMemory
проблема возникла при написании одной задачи, вот пример программы(ничего не делающей) в которой эта проблема проявляется -
unit MainUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
TThread1=class(TThread)
procedure Execute;override;
end;
TThread2=class(TThread)
procedure Execute;override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TThread1.Execute;
var
p:pointer;
begin
inherited;
repeat
GetMem(p,30*1024*1024);// выделить и освободить
FreeMem(p); // 30 мегабайт
until false;
end;
procedure TThread2.Execute;
const l=3000;
var
i:integer;
a:array[1..l] of pointer;
begin
inherited;
repeat
for i:=1 to l do GetMem(a[i],10);// выделить и освободить
for i:=1 to l do FreeMem(a[i]); // 3000 раз по 10 байт
until false;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Thread1:TThread1;
Thread2:TThread2;
begin
Thread1:=TThread1.Create(false);// Создать и запустить 1 поток
Thread2:=TThread2.Create(false);// Создать и запустить 2 поток
end;
end.
при запуске потоков по отдельности в процедуре Button1Click все работет отлично, но при одновременном их запуске возникает ошибка OutOfMemory.
Подскажите пожалуйста что неправильно.
Спасибо
Dmitrij_K (2006-09-17 21:33:00) [21]
> осле выделения она сразу освобождается,
Извени, не заметил.
У меня работает нормально.
Павел И (2006-09-17 21:26:00) [22]
> А сам догадаться не можешь?
> OutOfMemory
>
Памяти запрашивается очень мало всего 30 мб в первом потоке и 30 кб во втором, после выделения она сразу освобождается, как может быть что ее действительно недостаточно? (Тем более что можно свободно взять и 300 мб, проблема возникает только при использовании нескольких потоков)
Dmitrij_K (2006-09-17 21:17:00) [23]А сам догадаться не можешь?
OutOfMemory