Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблемы с выделением памяти в потоках [D7, WinXP]


Страницы:   1 2

Павел И ©   (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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо