Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 01.01.2022
Сообщений: 11
RAD 2006-2007

При выполнении процедуры в потоке вылетает багрепорт access violation строка callwindowproc

06.01.2022, 16:08. Показов 2337. Ответов 26

Студворк — интернет-сервис помощи студентам
процедура выполняет поиск строк заданной длины в комбобоксе и ищет совпадения. когда выполняется процедура периодически вылетает багрепорт access violation в vcl.controls в строке callwindowproc. вылет происходит с файлами , у которых больше 8к символов. с файлами, у которых до 50 символов все работает замечательно. много читал форумов и так не докопался до причины появления такого багрепорта, но есть подозрения связанные с временем жизни переменных.
как исправить?
пы.сы. про потокобезопасность знаю, про синхронизацию тоже. не нужно на это обращать внимание,это не мой вопрос!
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
procedure tmythread2.Execute;
var c,dl_sync,i,j,x,xx,a,k_bufs,gg,gg2,usl:integer;
 
    buf1,buf2:string;
    flag1,flag2,flag3:boolean;
begin
 
form1.RichEdittext.SelStart:=0;
form1.RichEdittext.SelLength:=DL_rich;
form1.RichEdittext.SelAttributes.Color:=clblack;
form1.richedittext.SelAttributes.Style := [];
 
     c:=form1.combobox2.ItemIndex;
     case c of
              0: dl_sync:=16;
              1: dl_sync:=32;
              2: dl_sync:=64;
              3: dl_sync:=128;
              4: dl_sync:=6;
              5: dl_sync:=4;
              6: dl_sync:=2;
     end;
     i:=0; j:=-1;  x:=0;xx:=0; buf1:=''; buf2:=''; k_bufs:=0;  flag1:=false;  flag2:=false; flag3:=false; ext:=False; a:=0;
      gg:=0; gg2:=0; usl:=0;
     while (i<=dl_rich)and(flag3=False)and(ext=false) do
     begin
           inc(i);
           form1.RichEditText.HideSelection:=False;
           form1.RichEditText.SelStart:=i;
                if (x<dl_sync) then
                begin
                    inc(x);
                    buf1:=buf1+form1.richedittext.text[i];
                end;
                if (x=dl_sync)and(flag1=false) then
                begin
                      j:=i; 
                      inc(i);
                      form1.RichEditText.SelStart:=i;
                      flag1:=true;     //   можно заполнять второй буфер
                end;
     with form1.progressbar1 do
     begin
        form1.ProgressBar1.Min:=0;
        form1.ProgressBar1.Max:=dl_rich;
           while (j<=dl_rich)and(flag1=true)and(i<=dl_rich)and(ext=false) do
           begin
                inc(j);
                form1.ProgressBar1.Position:=j;
                form1.RichEditText.SelStart:=j;
                if ((form1.richedittext.text[j]=#10)or(form1.richedittext.text[j]=#13)) then
                begin
                     ext:=true;
                end else
                begin
                      if (j<=dl_rich)and(i<=dl_rich)and(ext=false) then
                      begin
                if (xx<dl_sync)and(flag1=true) then
                begin
                      inc(xx);
                      buf2:=buf2+form1.richedittext.text[j];
                end;
                if (xx=dl_sync)and(flag2=false) then
                begin
                      flag2:=true;// можно сравнивать
                end;
                  if (xx=dl_sync)and(x=dl_sync)  then
                  begin
                      while a<dl_sync do
                      begin
                            inc(a);   
                            if buf1[a]=buf2[a] then
                            begin
                                inc(k_bufs);  
                            end;
                      end;
                      gg:=round((k_bufs/dl_sync)*100);  //кол-во верных симв
                      gg2:=100-gg; //% oshibok
                      usl:=strtoint(form1.edit2.text); //%
                      if usl>=gg2 then
                      begin
                            k_bufs:=0;                                         //   заполнил второе и последующие
                            //showmessage('ebat zapolnyau');
                            form1.RichEdittext.SelStart:=j-dl_sync;
                            form1.RichEdittext.SelLength:=dl_sync;
                            form1.RichEdittext.SelAttributes.Color:=clred;
                            form1.richedittext.SelAttributes.Style := form1.RichEdittext.SelAttributes.Style+[fsBold];
                       ////////////////////////////
                                  if flag3=false then                                   ///заполнил первое попадание
                                  begin
                                       form1.RichEdittext.SelStart:=i-dl_sync-1;
                                     form1.RichEdittext.SelLength:=dl_sync;            
                                     form1.RichEdittext.SelAttributes.Color:=clred;
                                     form1.richedittext.SelAttributes.Style := form1.RichEdittext.SelAttributes.Style+[fsBold];
                                  end;
                                flag3:=True; //мне хватит
                            xx:=0;  buf2:='';
                      end else
                      begin
                            //inc(j);
                            k_bufs:=0;
                            j:=j-dl_sync+1;
                            buf2:=''; xx:=0; //flag3:=true;//net sovpadenii s buf2
                      end;
                      a:=0;  //k_bufs:=0;
                  end;//if xx and x
                 end; // j<=dl-rich
              end; //if flag3
           end; //while j
           if j>=dl_rich then
           begin
                j:=i+dl_sync;
                i:=i-dl_sync;
                x:=0;   xx:=0;        buf1:='';         buf2:='';       flag1:=False;
           end;
        if ext=true then   //(i>=dl_rich)and(j>=dl_rich) then
        begin
           mythread2.Terminate;
           showmessage('файл просканирован');
        end;
     end; //progbar
  end; 
end; //procedure
Миниатюры
При выполнении процедуры в потоке вылетает багрепорт access violation строка callwindowproc  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.01.2022, 16:08
Ответы с готовыми решениями:

Access Violation при запуске парсинга в отдельном потоке
Я пытаюсь в потоке выполнить функцию парсинга, при компиляции ошибок не возникает, но когда жму на Button1 вылазит ошибка: project...

При работе с библиотекой winapi и при выполнении скриптов появляется ошибка Access Violation
Помогите с проблемой. При работе с библиотекой winapi и при выполнении скриптов появляеться ошибка Access Violation ... и адрес... Где...

При закрытии программы вылетает ошибка: Access Violation
Здравствуйте уважаемые знатоки. Помогите пожалуйста справится с проблемой. При закрытии программы вылетает ошибка First chance...

26
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
06.01.2022, 18:12
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Verevkin Посмотреть сообщение
Для поиска-то он (richedit) зачем?
Ну как? )))) Ричэдит - для выделения цветом. Что было под руками, то и используется. )))
0
0 / 0 / 0
Регистрация: 01.01.2022
Сообщений: 11
06.01.2022, 18:14  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
Хрен с ним - с выделением. Для поиска-то он (richedit) зачем?
Какого хера он у тебя внутри треда делает-то, бестолочь?
в ричэдит помещаю бинарную последовательность, в потоке читаю значения из него
0
Нарушитель
10897 / 5831 / 1289
Регистрация: 12.03.2015
Сообщений: 26,915
06.01.2022, 18:16
Цитата Сообщение от judzhis_doc Посмотреть сообщение
в ричэдит помещаю бинарную последовательность
пипец.
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
06.01.2022, 18:22
Лучший ответ Сообщение было отмечено judzhis_doc как решение

Решение

Цитата Сообщение от judzhis_doc Посмотреть сообщение
я так рад, что меня уже понимают...))))))
Как бы то ни было, поиск и визуализацию я бы разделил.
Сначала - поиск и заполнение результатами внутренних структур. Например, массивов. Это можно делать в потоках, с соблюдением правил потокобезопасности.
А затем уже визуализация результатов, хоть в ричэдите, хоть где.

Добавлено через 1 минуту
Цитата Сообщение от judzhis_doc Посмотреть сообщение
в ричэдит помещаю бинарную последовательность, в потоке читаю значения из него
А нужно наоборот.
Сначала читать и искать в потоках.
А затем показывать и подсвечивать.
2
0 / 0 / 0
Регистрация: 01.01.2022
Сообщений: 11
06.01.2022, 18:30  [ТС]
Цитата Сообщение от Constcat Посмотреть сообщение
Как бы то ни было, поиск и визуализацию я бы разделил.
Сначала - поиск и заполнение результатами внутренних структур. Например, массивов. Это можно делать в потоках, с соблюдением правил потокобезопасности.
А затем уже визуализация результатов, хоть в ричэдите, хоть где.
как мне безопасно в поток последовательность поместить и как потом безопасно вывести?
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
06.01.2022, 18:41
Цитата Сообщение от judzhis_doc Посмотреть сообщение
как мне безопасно в поток последовательность поместить и как потом безопасно вывести?
Тут вопрос даже не в потоке.
Все то, что ты делаешь "на лету" в ричэдите, нужно предварительно подготовить в похожей структуре. С полями, типа
<начальная позиция>
<длина>
<цвет>
<стиль>
<и т.д.>
- все то, что нужно для ричэдита.
И только потом, когда ты обработал данные и подготовил эту структуру, ты выводишь эти данные в ричэдит и раскрашиваешь согласно этой структуре.
И для этого, возможно, даже поток не понадобится.
1
0 / 0 / 0
Регистрация: 01.01.2022
Сообщений: 11
06.01.2022, 18:43  [ТС]
Цитата Сообщение от Constcat Посмотреть сообщение
Тут вопрос даже не в потоке.
Все то, что ты делаешь "на лету" в ричэдите, нужно предварительно подготовить в похожей структуре. С полями, типа
<начальная позиция>
<длина>
<цвет>
<стиль>
<и т.д.>
- все то, что нужно для ричэдита.
И только потом, когда ты обработал данные и подготовил эту структуру, ты выводишь эти данные в ричэдит и раскрашиваешь согласно этой структуре.
я понял, попробую
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.01.2022, 18:43

Вылетает Access при выполнении запроса
доброго времени суток. вопрос такой - есть запрос: INSERT INTO ( RESH_ID, , , , ) SELECT F1.RESH_ID AS Выражение2, Forms!!+ ...

Форма в DLL при обновлении в цикле вылетает или вызывает access violation
Добрый день. Пишу DLL, внутри нее находится форма со Stringgrid и RichView. DLL получает данные из стороннего приложения и отображает их...

"Access violation" при выполнении fadd qword ptr [edi+eax*8-8]
В конце блока вычислений находится конструкция: mov eax,dword ptr add eax,eax fadd qword ptr ...

Access violation в потоке
Написал в конструкторе первой формы создание thread который нормально тут же запустился и все хорошо, нужно послать пост запрос и...

CppWebBrowser access violation в новом потоке
Всем привет. В чем может быть проблема если при выполнении в новом потоке: AnsiString htmlTXT =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru