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

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

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

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

Kolovrat

Принятый Кодер
Регистрация
10 Апр 2016
Сообщения
38
Баллы
50
Возраст
37
не могу понять почему в конце работы софта ошибка вылетает,пишет что,что то с памятью,но опыта не хватает найти в чем проблема
суть написания сортировщика баз многопоточного,это кусок кода,а остальное я удалил чтоб легче было понять проблему,самое главное что работает очень быстро,но в конце краш,в чем может быть проблема?
код ошибки
"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;
 

Kolovrat

Принятый Кодер
Регистрация
10 Апр 2016
Сообщения
38
Баллы
50
Возраст
37
попробуй освобождать поток или чисть
можно пример пожалуйста?через отладчик ничего такого не заметил,только потоки там не реально отследить

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

Kolovrat

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

Sascha

Заместитель Администратора
Команда форума
Администратор
Регистрация
9 Май 2015
Сообщения
1,071
Баллы
155
Возраст
51
А можно кусок проекта , а то времени сейчас нету собирать и тестировать код , возможно ошибка в самом проекте или компонент
 

Sascha

Заместитель Администратора
Команда форума
Администратор
Регистрация
9 Май 2015
Сообщения
1,071
Баллы
155
Возраст
51
При первом запуске поток циклица
 

Kolovrat

Принятый Кодер
Регистрация
10 Апр 2016
Сообщения
38
Баллы
50
Возраст
37
При первом запуске поток циклица
это я сразу понял что,что то не так с потоком,но в чем же и где ошибка и как ее исправить? потому что стоит софт запустить в одном потоке все работает без ошибок
 

Sascha

Заместитель Администратора
Команда форума
Администратор
Регистрация
9 Май 2015
Сообщения
1,071
Баллы
155
Возраст
51
можно пример пожалуйста?через отладчик ничего такого не заметил,только потоки там не реально отследить

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

Kolovrat

Принятый Кодер
Регистрация
10 Апр 2016
Сообщения
38
Баллы
50
Возраст
37
Вот тут одну ошибку нашол
SetLength(thread_mass, SpinEdit.Value); (Поток , n ) n- количество потоков
а в чем ошибка то?массив динамический, а SetLength задает длину массива,создать количество потоков которое будет равно SpinEdit.Value на выходе тип данных integer
 

Sascha

Заместитель Администратора
Команда форума
Администратор
Регистрация
9 Май 2015
Сообщения
1,071
Баллы
155
Возраст
51
а в чем ошибка то?массив динамический, а SetLength задает длину массива,создать количество потоков которое будет равно SpinEdit.Value на выходе тип данных integer
Я не уверена, что это можно назвать ошибкой, но на мой взгляд это так .
Код:
SetLength(thread_mass, SpinEdit.Value -1);
У тебя стоит количество потоков -1 , у меня вопрос зачем ? -1 указываешь в
Код:
for i := 0 to SpinEdit.Value -1 do
здесь , что означает до конца строки.
 

Kolovrat

Принятый Кодер
Регистрация
10 Апр 2016
Сообщения
38
Баллы
50
Возраст
37
это означает что SpinEdit.Value счет начинает с 0 и чтоб в дальнейшем не произошло не совпадений надо в некоторых случаях писать -1, чтоб этот 0 обойти и начать считать 1,а не с нуля
 

Kolovrat

Принятый Кодер
Регистрация
10 Апр 2016
Сообщения
38
Баллы
50
Возраст
37
Я знаю что это работает в мемо а не в едите ,ну может и ошибаюсь,ну попробуй поставить с 0
это не эдит это спинэдит(SpinEdit) и счет у него начинается с 0 это точно,у эдита свойства валуе(Value) нету
 

Kolovrat

Принятый Кодер
Регистрация
10 Апр 2016
Сообщения
38
Баллы
50
Возраст
37
все тему можно закрывать сам нашел свою ошибку,спасибо вам хотя бы за попытку
 

Sascha

Заместитель Администратора
Команда форума
Администратор
Регистрация
9 Май 2015
Сообщения
1,071
Баллы
155
Возраст
51
эсли не трудно на будущее где ошибка была
 

Kolovrat

Принятый Кодер
Регистрация
10 Апр 2016
Сообщения
38
Баллы
50
Возраст
37
в Count, когда цикл идет надо минус ставить,ведь счет с нуля начинается
 

Sascha

Заместитель Администратора
Команда форума
Администратор
Регистрация
9 Май 2015
Сообщения
1,071
Баллы
155
Возраст
51

Kolovrat

Принятый Кодер
Регистрация
10 Апр 2016
Сообщения
38
Баллы
50
Возраст
37
да, но там еще были ошибки,я пока отложил эту тему,главное краш прошел,дальше уже будет время разберусь с этой темой
 
Вверх