![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
MemoryStream в потоке [XP]
mm0 © (2010-08-16 15:19:00)Почему иногда(редко может 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 16:50:00) [1]
> начать освоение работы с потоками с TThread
Или уж , на кр.случай, начать с внимательного изучения станд.справки по теме "Thread managment routines"
MBo (2010-08-16 16:48:00) [2]>какому прототипу, в каком разделе можно про него поискать?
В хелпе по CreateThread.
Однако вместо CreateThread нужно BeginThread использовать, что, по крайней мере, доведет до сведения дельфийского менеджера памяти, что ему придется работать в многопоточном режиме.
А лучше, наверно, как Сергей советует, начать освоение работы с потоками с TThread.
Сергей М. (2010-08-16 16:38:00) [3]
> если он мне не нежен я его грамотно прибиваю
Ничто не мешает "грамотно прибивать" TThread.
> знаю что он в какое время делает
Судя по приведенному тобой коду не имеешь ни малейшего представления.
> если в это время delphi что-то делает с памятью в своем
> классе, то может быть такое ого
А ты не трожь дельфийский менеджер)
Или изволь придерживаться соглашений о мультипоточном его использовании, чтобы не получить по лбу этим самым "ого")
Или, что в идеале для начинающего, не трогай WinAPI и изучай работу потоков с использованием TThread - там предусмотрена защита от "ого".
mm0 (2010-08-16 16:30:00) [4]"Поточная функция должна соответствовать строго определенному прототипу"- несовсем понял про что вы говорите...какому прототипу, в каком разделе можно про него поискать?
mm0 (2010-08-16 16:27:00) [5]MemoryStream использую, потому что через него работают другие нужные мне классы delphi.Я бы с радостью от него отказался....
"круче" потока под управлением - если он мне не нежен я его грамотно прибиваю windows функциями и знаю что он в какое время делает. А если в это время delphi что-то делает с памятью в своем классе, то может быть такое ого..
MBo (2010-08-16 16:21:00) [6]Поточная функция должна соответствовать строго определенному прототипу.
Сергей М. (2010-08-16 16:15:00) [7]
> Класс - не нужен
Сам себе противоречишь.
Не нужен класс ? Тогда с какой рабости ты пользуешь классTMemoryStream ?
> поток на API и windows-кие функции для работы с ним
И чем же оно будет "круче" потока под управлением TThread и дельфийских способов для работы с ним ?
mm0 (2010-08-16 16:12:00) [8]Класс - не нужен. Для моих задач нужен поток на API и windows-кие функции для работы с ним.
Синронизацию точно учел.C Mem никто других действий не делает..
Так, что с этим MemoryStream может быть?
Сергей М. (2010-08-16 15:49:00) [9]
> MemoryStream - это же не визуальный контрол, на отображения
> формы не влияет, от нее не зависит, поэтому я так полагаю
> его где угодно можно использовать
Тоже самое (с некоторыми оговорками, актуальными и для CreateThread) относится и к TThread.
Так чем же не угодил TThread ?
mm0 (2010-08-16 15:43:00) [10]Зачем: Планирую потом это код убрать из программы и в dll засунуть.
MemoryStream - это же не визуальный контрол, на отображения формы не влияет, от нее не зависит, поэтому я так полагаю его где угодно можно использовать.
Сергей М. (2010-08-16 15:21:00) [11]
> Может я не так его использую?
Конечно не так.
А скажи, любезный, чем тебе не угодил класс TThread и зачем тебя понесло в дебри WinAPI ?