Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2011, 22:23   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию спонтанная ошибка при синхронизации потока Thread и основного приложения(Посылка сообщений)

Всем привет!
Собственно вот такая AV у пользователей при закрытии моей программы:
Код:
exception class   : EAccessViolation
exception message : Access violation at address 005F5006 in module 'HLR.exe'. Read of address 34333231.

main thread ($e4c):
005f5006 +016 HLR.exe      AppThreadUnit 368  +2 TAppThread.StatusMessageSend
0046ead9 +0fd HLR.exe      Classes               CheckSynchronize
0046f0be +06a HLR.exe      Classes               TThread.WaitFor
0046ed21 +02d HLR.exe      Classes               TThread.Destroy
005f421e +012 HLR.exe      AppThreadUnit  57  +1 TAppThread.Destroy
00403ec0 +008 HLR.exe      System                TObject.Free
0045a450 +008 HLR.exe      SysUtils              FreeAndNil
00613d90 +058 HLR.exe      AppsListUnit  156  +7 TApp.Stop
00614e9f +00f HLR.exe      AppsListUnit  379  +1 TAppsList.StopOne
00618beb +103 HLR.exe      MainUnit      866 +43 TMainForm.FormCloseQuery
004c0245 +055 HLR.exe      Forms                 TCustomForm.CloseQuery
004c016d +021 HLR.exe      Forms                 TCustomForm.Close
0061722b +01b HLR.exe      MainUnit      320  +6 TMainForm.MExitClick
004ca8a2 +0a6 HLR.exe      Menus                 TMenuItem.Click
004cbb93 +013 HLR.exe      Menus                 TMenu.DispatchCommand
004cc8a2 +082 HLR.exe      Menus                 TPopupList.WndProc
004cc7f1 +01d HLR.exe      Menus                 TPopupList.MainWndProc
00470174 +014 HLR.exe      Classes               StdWndProc
77363573 +00a USER32.dll                         DispatchMessageA
004c377f +083 HLR.exe      Forms                 TApplication.ProcessMessage
004c37b6 +00a HLR.exe      Forms                 TApplication.HandleMessage
004c39e6 +096 HLR.exe      Forms                 TApplication.Run
0061a741 +3b9 HLR.exe      HLR           149 +70 initialization

disassembling:
005f4ff0     public AppThreadUnit.TAppThread.StatusMessageSend:  ; function entry point
005f4ff0 366   push    ebx
005f4ff1 367   mov     edx, [eax+$a0]
005f4ff7       mov     edx, [edx]
005f4ff9       test    edx, edx
005f4ffb       jz      loc_5f500b
005f4ffb
005f4ffd 368   mov     edx, [edx+8]
005f5000       mov     ecx, [eax+$48]
005f5003       xor     eax, eax
005f5005       xchg    eax, edx
005f5006     > mov     ebx, [eax]              ; <= EXCEPTION
005f5008       call    dword ptr [ebx+$20]
005f5008
005f500b     loc_5f500b:
005f500b 369   pop     ebx
005f500c       ret
в следующих функциях:
Код:
  public
    MessageToForm: string;
    {...}
    procedure StatusMessage(s: string);
    procedure StatusMessageSend;
  end;

... 


implementation

.... 

procedure TAppThread.StatusMessage(s: string);
begin
  MessageToForm := s;
  Synchronize(StatusMessageSend);
end;

procedure TAppThread.StatusMessageSend;
begin
  if AppInfo.LI <> nil then
    AppInfo.LI.SubItems[0] := MessageToForm;
end;
Ошибка происходит у пользователей, не у меня. При том происходит спонтанно. В чем причина ошибки?
Вроде все правильно. Поток шлёт сообщение на форму через синхронизацию.

Последний раз редактировалось Человек_Борща; 13.05.2011 в 22:25.
Человек_Борща вне форума Ответить с цитированием
Старый 14.05.2011, 07:57   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

На стек вызовов смотрел? У тебя поток прибивается, походу:

сначала:

Код:
005f421e +012 HLR.exe      AppThreadUnit  57  +1 TAppThread.Destroy
а уже потом:

Код:
005f5006 +016 HLR.exe      AppThreadUnit 368  +2 TAppThread.StatusMessageSend
Естественно, при попытке обращения к полю MessageToForm убитого объекта будет AV.

Update: хотя, судя по дизассемблеру, ошибка как раз в том, что AppInfo.LI.SubItems = 34333231, что уже не является актуальным указателем на что-либо:

Код:
005f4ff0 366   push    ebx
005f4ff1 367   mov     edx, [eax+$a0]  ; edx = AppInfo
005f4ff7       mov     edx, [edx]             ; edx = AppInfo.LI
005f4ff9       test    edx, edx             ; AppInfo.LI == nil?
005f4ffb       jz      loc_5f500b
005f4ffb
005f4ffd 368   mov     edx, [edx+8]  ; edx = AppInfo.LI.SubItems
005f5000       mov     ecx, [eax+$48]  ; ecx = MessageToForm
005f5003       xor     eax, eax   ; eax = 0
005f5005       xchg    eax, edx  ; eax = AppInfo.LI.SubItems, edx = 0
005f5006     > mov     ebx, [eax]              ; <= EXCEPTION, потому что AppInfo.LI.SubItems указывает в никуда
005f5008       call    dword ptr [ebx+$20]  ; вызов TListItems.SetItem
Стандартная проблема, когда указатели на один и тот же объект хранятся в 9000 местах и освобождение в одном месте приводит к AV в 8999 других местах.

А вобще, у тебя происходит TMainForm.FormCloseQuery(), т.е. приложение закрывают, объекты освобождаются, и тут вылазит твой StatusMessageSend() и говорит, "так, а ну всем стоять. у меня тут крайне важное сообщение для главной формы!". Естественно, его посылают на 2 буквы в грубой форме )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 14.05.2011 в 08:22.
veniside вне форума Ответить с цитированием
Старый 14.05.2011, 22:25   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

хм, оказалось все так просто. Сообщение от потока идёт в никуда...
Пойду исправлю чтоль...

Спасибо за разяснительный и внятный ответ. (+ без проблем)
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
THTTPCli, обработчик события выполняется в контексте основного потока profaller Работа с сетью в Delphi 4 08.02.2011 16:25
Посылка пользовательских сообщений в чужое приложение RFbager Win Api 8 11.01.2011 20:51
Ошибка при отправке сообщений через SMTPClient BoT_T Работа с сетью в Delphi 6 26.09.2010 17:16
Thread. проблемы с работой потока. Моментально исчезают созданные в потоке формы. Casper-SC Общие вопросы .NET 3 24.04.2010 12:28
Посылка сообщений Windows другой программе shurik_7866 Win Api 1 23.10.2008 16:25