Ошибка И Краш Софта В Конце Работы

Kolovrat

Принятый Кодер
Ofline
не могу понять почему в конце работы софта ошибка вылетает,пишет что,что то с памятью,но опыта не хватает найти в чем проблема
суть написания сортировщика баз многопоточного,это кусок кода,а остальное я удалил чтоб легче было понять проблему,самое главное что работает очень быстро,но в конце краш,в чем может быть проблема?
код ошибки
"Exception EinvalidPointer in module Project.exe at 00002ABB.
Invalid pointer operation."

83EDF98iCi.jpg

вот код

procedure Potok.Execute;
begin
while working do
begin
try
CS.Enter;
Inc(num);
if num < Filez.Count then
num_thred := num
else working := false;
finally
CS.Leave;
end;
if pos('@mail.ru',LowerCase(Filez.Strings[num_thred]))<> 0 then
begin
mail_D := mail_D + Filez.Strings[num_thred] + #13#10 ;
rez := 1;
Inc(chez);
Sleep(3);
Synchronize(Synhz);
end
else if pos('@bk.ru',LowerCase(Filez.Strings[num_thred]))<>0 then
begin
mail_D := mail_D + Filez.Strings[num_thred] + #13#10;
rez := 1;
Inc(chez);
Sleep(3);
Synchronize(Synhz);
end
else if pos('@list.ru',LowerCase(Filez.Strings[num_thred]))<>0 then
begin
mail_D := mail_D + Filez.Strings[num_thred] + #13#10;
rez := 1;
Inc(chez);
Sleep(3);
Synchronize(Synhz);
end
else if pos('@inbox',LowerCase(Filez.Strings[num_thred]))<>0 then
begin
mail_D := mail_D + Filez.Strings[num_thred] + #13#10;
rez := 1;
Inc(chez);
Sleep(3);
Synchronize(Synhz);
end else begin
ether_D := ether_D + Filez.Strings[num_thred] + #13#10;
rez := 2;
Inc(chez2);
Sleep(3);
Synchronize(Synhz);
end;
end;
end;

/////////////////////////////////////////////////////////////////
procedure Potok.Synhz;
begin
case rez of
1: Form1.Label4.Caption := IntToStr(chez);
2: Form1.Label12.Caption := IntToStr(chez2);
end;
end;
 
попробуй освобождать поток или чисть
можно пример пожалуйста?через отладчик ничего такого не заметил,только потоки там не реально отследить

вот как у меня потоки создаются
procedure TForm1.StartClick(Sender: TObject);
var i: integer;
begin
num := -1;
working := True;
chez := 0;
chez2 := 0;
SetLength(thread_mass, SpinEdit.Value -1);
for i := 0 to SpinEdit.Value -1 do
begin
thread_mass := Potok.Create(True);
thread_mass.Priority := tpNormal;
thread_mass.FreeOnTerminate := True;
thread_mass.Resume;
end;
end;
 
я понимаю что времени ни у кого нету и бесплатно сейчас ни кто не помогает,по этому готов сделать не большое пожертвование на поддержку форума,если поможите решить эту проблему,здесь серьезного и страшного ничего нет,есть ошибка как я понимаю связанная с потоками,код основного потока выше указан и создание тоже,хотел бы понять что не так и как исправить,смешно сказать но в трех соснах заблудился,кода как кот наплакал,но ничего не пойму,аналогичная конструкция в другом подобном софте работает на ура и нет ни каких ошибок, а здесь при завершении софт вылетает ошибка "EAccessViolation Приложение осуществило доступ к неверному адресу в памяти. Обычно это означает, что программа обратилась за данными по неинициализированному указателю." понимаю что потоки походу обращаются к данным которые не существуют,но опыта не хватает исправить это,если нужно выложу другие процедуры и функции,но не думаю что в них может быть проблема
 
А можно кусок проекта , а то времени сейчас нету собирать и тестировать код , возможно ошибка в самом проекте или компонент
 
можно пример пожалуйста?через отладчик ничего такого не заметил,только потоки там не реально отследить

вот как у меня потоки создаются
procedure TForm1.StartClick(Sender: TObject);
var i: integer;
begin
num := -1;
working := True;
chez := 0;
chez2 := 0;
SetLength(thread_mass, SpinEdit.Value -1);
for i := 0 to SpinEdit.Value -1 do
begin
thread_mass := Potok.Create(True);
thread_mass.Priority := tpNormal;
thread_mass.FreeOnTerminate := True;
thread_mass.Resume;
end;
end;
Вот тут одну ошибку нашол
SetLength(thread_mass, SpinEdit.Value); (Поток , n ) n- количество потоков
 
Вот тут одну ошибку нашол
SetLength(thread_mass, SpinEdit.Value); (Поток , n ) n- количество потоков
а в чем ошибка то?массив динамический, а SetLength задает длину массива,создать количество потоков которое будет равно SpinEdit.Value на выходе тип данных integer
 
а в чем ошибка то?массив динамический, а SetLength задает длину массива,создать количество потоков которое будет равно SpinEdit.Value на выходе тип данных integer
Я не уверена, что это можно назвать ошибкой, но на мой взгляд это так .
Код:
SetLength(thread_mass, SpinEdit.Value -1);
У тебя стоит количество потоков -1 , у меня вопрос зачем ? -1 указываешь в
Код:
for i := 0 to SpinEdit.Value -1 do
здесь , что означает до конца строки.
 
это означает что SpinEdit.Value счет начинает с 0 и чтоб в дальнейшем не произошло не совпадений надо в некоторых случаях писать -1, чтоб этот 0 обойти и начать считать 1,а не с нуля
 
Я знаю что это работает в мемо а не в едите ,ну может и ошибаюсь,ну попробуй поставить с 0
 
все тему можно закрывать сам нашел свою ошибку,спасибо вам хотя бы за попытку
 
эсли не трудно на будущее где ошибка была
 
в Count, когда цикл идет надо минус ставить,ведь счет с нуля начинается
 
да, но там еще были ошибки,я пока отложил эту тему,главное краш прошел,дальше уже будет время разберусь с этой темой
 
Назад
Сверху Снизу