• Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

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

K Оффлайн

Kolovrat

Оффлайн
Новичок
10 Апр 2016
38
8
50
34
не могу понять почему в конце работы софта ошибка вылетает,пишет что,что то с памятью,но опыта не хватает найти в чем проблема
суть написания сортировщика баз многопоточного,это кусок кода,а остальное я удалил чтоб легче было понять проблему,самое главное что работает очень быстро,но в конце краш,в чем может быть проблема?
код ошибки
"Exception EinvalidPointer in module Project.exe at 00002ABB.
Invalid pointer operation."


вот код

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;
 
K Оффлайн

Kolovrat

Оффлайн
Новичок
10 Апр 2016
38
8
50
34
попробуй освобождать поток или чисть
можно пример пожалуйста?через отладчик ничего такого не заметил,только потоки там не реально отследить

вот как у меня потоки создаются
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;
 
K Оффлайн

Kolovrat

Оффлайн
Новичок
10 Апр 2016
38
8
50
34
я понимаю что времени ни у кого нету и бесплатно сейчас ни кто не помогает,по этому готов сделать не большое пожертвование на поддержку форума,если поможите решить эту проблему,здесь серьезного и страшного ничего нет,есть ошибка как я понимаю связанная с потоками,код основного потока выше указан и создание тоже,хотел бы понять что не так и как исправить,смешно сказать но в трех соснах заблудился,кода как кот наплакал,но ничего не пойму,аналогичная конструкция в другом подобном софте работает на ура и нет ни каких ошибок, а здесь при завершении софт вылетает ошибка "EAccessViolation Приложение осуществило доступ к неверному адресу в памяти. Обычно это означает, что программа обратилась за данными по неинициализированному указателю." понимаю что потоки походу обращаются к данным которые не существуют,но опыта не хватает исправить это,если нужно выложу другие процедуры и функции,но не думаю что в них может быть проблема
 
Sascha Оффлайн

Sascha

Заместитель Администратора
Оффлайн
Команда форума
Администратор
9 Май 2015
1,063
282
155
48
А можно кусок проекта , а то времени сейчас нету собирать и тестировать код , возможно ошибка в самом проекте или компонент
 
K Оффлайн

Kolovrat

Оффлайн
Новичок
10 Апр 2016
38
8
50
34
При первом запуске поток циклица
это я сразу понял что,что то не так с потоком,но в чем же и где ошибка и как ее исправить? потому что стоит софт запустить в одном потоке все работает без ошибок
 
Sascha Оффлайн

Sascha

Заместитель Администратора
Оффлайн
Команда форума
Администратор
9 Май 2015
1,063
282
155
48
можно пример пожалуйста?через отладчик ничего такого не заметил,только потоки там не реально отследить

вот как у меня потоки создаются
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- количество потоков
 
  • Like
Reactions: Kolovrat
K Оффлайн

Kolovrat

Оффлайн
Новичок
10 Апр 2016
38
8
50
34
Вот тут одну ошибку нашол
SetLength(thread_mass, SpinEdit.Value); (Поток , n ) n- количество потоков
а в чем ошибка то?массив динамический, а SetLength задает длину массива,создать количество потоков которое будет равно SpinEdit.Value на выходе тип данных integer
 
Sascha Оффлайн

Sascha

Заместитель Администратора
Оффлайн
Команда форума
Администратор
9 Май 2015
1,063
282
155
48
а в чем ошибка то?массив динамический, а SetLength задает длину массива,создать количество потоков которое будет равно SpinEdit.Value на выходе тип данных integer
Я не уверена, что это можно назвать ошибкой, но на мой взгляд это так .
Код:
SetLength(thread_mass, SpinEdit.Value -1);
У тебя стоит количество потоков -1 , у меня вопрос зачем ? -1 указываешь в
Код:
for i := 0 to SpinEdit.Value -1 do
здесь , что означает до конца строки.
 
  • Like
Reactions: Kolovrat
K Оффлайн

Kolovrat

Оффлайн
Новичок
10 Апр 2016
38
8
50
34
это означает что SpinEdit.Value счет начинает с 0 и чтоб в дальнейшем не произошло не совпадений надо в некоторых случаях писать -1, чтоб этот 0 обойти и начать считать 1,а не с нуля
 
K Оффлайн

Kolovrat

Оффлайн
Новичок
10 Апр 2016
38
8
50
34
Я знаю что это работает в мемо а не в едите ,ну может и ошибаюсь,ну попробуй поставить с 0
это не эдит это спинэдит(SpinEdit) и счет у него начинается с 0 это точно,у эдита свойства валуе(Value) нету
 
K Оффлайн

Kolovrat

Оффлайн
Новичок
10 Апр 2016
38
8
50
34
все тему можно закрывать сам нашел свою ошибку,спасибо вам хотя бы за попытку
 
  • Like
Reactions: Sascha
K Оффлайн

Kolovrat

Оффлайн
Новичок
10 Апр 2016
38
8
50
34
в Count, когда цикл идет надо минус ставить,ведь счет с нуля начинается
 
  • Like
Reactions: Lomanu4
Sascha Оффлайн

Sascha

Заместитель Администратора
Оффлайн
Команда форума
Администратор
9 Май 2015
1,063
282
155
48
K Оффлайн

Kolovrat

Оффлайн
Новичок
10 Апр 2016
38
8
50
34
да, но там еще были ошибки,я пока отложил эту тему,главное краш прошел,дальше уже будет время разберусь с этой темой