Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.11.07;
Скачать: CL | DM;

Вниз

MemoryStream в потоке   Найти похожие ветки 

 
mm0   (2010-08-16 15:19) [0]

Почему иногда(редко может 1 из 10 раз) вылетает Access Violitation
когда начинаю писать в память. Хотя перед этим я ее очистил и Position перевел на ноль.
строчка Mem.LoadFromFile("file1.txt")
Ниже я привел пример такой конструкции.
У меня программе в потоке делается очень много действий перед этой строчкой и после нее.

Даже если что-то лезет не туда,то LoadFromFile по логике должен резирвировать память заново
(было же Mem.Clear). И имено на этой строке ошибок быть не должно

Переменная Mem нужна как глобальная.
Потому что я из нее потом в основном процессе данные читаю....

Может я не так его использую???
Delphi2010

.....
var
 Form1: TForm1;
 Mem:TMemoryStream;
 ThreadHandle,Threadid:LongWord;
implementation

{$R *.dfm}

procedure Thread1;
var ec:longword;
begin
  //do somthing
  Mem.Clear;
  Mem.LoadFromFile("file1.txt");   // ЗДЕСЬ
  //do somthing
 GetExitCodeThread(ThreadHandle,ec);
 ExitThread(ec);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ThreadHandle:=CreateThread(nil,0,@Thread1,nil,0,Threadid);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Mem:=TMemoryStream.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 Mem.Free;
end;
end.


 
Сергей М. ©   (2010-08-16 15:21) [1]


> Может я не так его использую?


Конечно не так.
А скажи, любезный, чем тебе не угодил класс TThread и зачем тебя понесло в дебри WinAPI ?


 
mm0   (2010-08-16 15:43) [2]

Зачем: Планирую потом это код убрать из программы и в dll засунуть.
MemoryStream - это же не визуальный контрол, на отображения формы не влияет, от нее не зависит, поэтому я так полагаю его где угодно можно использовать.


 
Сергей М. ©   (2010-08-16 15:49) [3]


> MemoryStream - это же не визуальный контрол, на отображения
> формы не влияет, от нее не зависит, поэтому я так полагаю
> его где угодно можно использовать


Тоже самое (с некоторыми оговорками, актуальными и для CreateThread) относится и к TThread.
Так чем же не угодил TThread ?


 
mm0   (2010-08-16 16:12) [4]

Класс - не нужен. Для моих задач нужен   поток на API и windows-кие функции для работы с ним.
Синронизацию точно учел.C Mem никто других действий не делает..
Так, что с этим MemoryStream может быть?


 
Сергей М. ©   (2010-08-16 16:15) [5]


> Класс - не нужен


Сам себе противоречишь.
Не нужен класс ? Тогда с какой рабости ты пользуешь класс TMemoryStream ?


> поток на API и windows-кие функции для работы с ним


И чем же оно будет "круче" потока под управлением TThread и дельфийских способов для работы с ним ?


 
MBo ©   (2010-08-16 16:21) [6]

Поточная функция должна соответствовать строго определенному прототипу.


 
mm0   (2010-08-16 16:27) [7]

MemoryStream использую, потому что через него работают другие нужные мне классы delphi.Я бы с радостью от него отказался....

"круче" потока под управлением  - если он мне не нежен я его грамотно прибиваю windows функциями и знаю что он в какое время делает. А если в это время delphi что-то делает с памятью в своем классе, то может быть такое  ого..


 
mm0   (2010-08-16 16:30) [8]

"Поточная функция должна соответствовать строго определенному прототипу" - несовсем понял про что вы говорите...какому прототипу, в каком разделе можно про него поискать?


 
Сергей М. ©   (2010-08-16 16:38) [9]


> если он мне не нежен я его грамотно прибиваю


Ничто не мешает "грамотно прибивать" TThread.


> знаю что он в какое время делает


Судя по приведенному тобой коду не имеешь ни малейшего представления.


> если в это время delphi что-то делает с памятью в своем
> классе, то может быть такое  ого


А ты не трожь дельфийский менеджер)
Или изволь придерживаться соглашений о мультипоточном его использовании, чтобы не получить по лбу этим самым "ого")
Или, что в идеале для начинающего, не трогай WinAPI и изучай работу потоков с использованием TThread - там предусмотрена защита от "ого".


 
MBo ©   (2010-08-16 16:48) [10]

>какому прототипу, в каком разделе можно про него поискать?
В хелпе по CreateThread.

Однако вместо CreateThread нужно BeginThread использовать, что, по крайней мере, доведет до сведения дельфийского менеджера памяти, что ему придется работать в многопоточном режиме.

А лучше, наверно, как Сергей советует, начать освоение работы с потоками с TThread.


 
Сергей М. ©   (2010-08-16 16:50) [11]


> начать освоение работы с потоками с TThread


Или уж , на кр.случай, начать с внимательного изучения станд.справки по теме "Thread managment routines"



Страницы: 1 вся ветка

Текущий архив: 2010.11.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
15-1280299629
12
2010-07-28 10:47
2010.11.07
Какую бы ед. измерения выбрать?


15-1279771521
Spot
2010-07-22 08:05
2010.11.07
Не работают точки останова


15-1280428521
Riply
2010-07-29 22:35
2010.11.07
Детектирование исполнителя путем поверхносного анализа :)


15-1280041741
Loginov Dmitry
2010-07-25 11:09
2010.11.07
Пишем свой wysiwyg HTML-редактор


15-1280435368
Юрий
2010-07-30 00:29
2010.11.07
С днем рождения ! 30 июля 2010 пятница