Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.007 c
15-1280139716
Alekcey
2010-07-26 14:21
2010.11.07
MAC по IP


2-1281552835
Andrey K
2010-08-11 22:53
2010.11.07
Нет доступа к свойству


2-1281601651
Nilman
2010-08-12 12:27
2010.11.07
Подскажите как работать с типом


15-1280344780
Kolan
2010-07-28 23:19
2010.11.07
Как проверить алгоритм


2-1281770096
Artemka86
2010-08-14 11:14
2010.11.07
Вывод информации в StringGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский