Форум: "Начинающим";
Текущий архив: 2010.11.07;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c