Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.24;
Скачать: CL | DM;

Вниз

Обработчик сообщений   Найти похожие ветки 

 
SVN17   (2003-07-11 15:18) [0]

Привет!!! Необходимо повесть обработчик сообщений, для объекта создаваемого в потоке.
Получил Handle используя AllocateHwnd.
Удалил Handle используя DeallocateHWnd.
Код:

constructor TTesting.Create;
begin
inherited Create;
FHandle := GetHandle;
end;

destructor TTesting.Destroy;
begin
if FHandle <> 0 then DeallocateHWnd(FHandle);
FHandle := 0;
inherited Destroy;
end;

function TTesting.GetHandle: HWND;
begin
if FHandle = 0 then
FHandle := AllocateHwnd(WndProc);
Result := FHandle;
end;

procedure TTesting.WndProc(var Message: TMessage);
begin
try
Dispatch(Message);
except
Application.HandleException(Self);
end;
end;

Проблема при завершении нити возникает ошибка обращения к памяти. Получается, что винда продолжает отсылать сообщения на
этот Handle.


 
VMcL ©   (2003-07-11 15:51) [1]

Кто родитель TTesting?


 
SVN17   (2003-07-11 15:54) [2]

Родителя нет.


 
reonid ©   (2003-07-11 17:34) [3]

А какой код самого потока?
Как сделан цикл выборки сообщений?
Как создаются и уничтожаются экземпляры TTesting?


 
VMcL ©   (2003-07-11 18:30) [4]

>SVN17 (11.07.03 15:54)
>Родителя нет.

Родителя нет только у TObject, у всех остальных - есть:

TMeClass = class
end;

эквивалентно
TMeClass = class(TObject)
end;


 
Набережных С. ©   (2003-07-11 20:21) [5]

VMcL © (11.07.03 18:30)
Это не родитель, а предое


 
SVN17   (2003-07-14 09:55) [6]


код потока:
TUThread = class(TThread)
private
FTest: TTesting;
protected
procedure Execute; override;
published
constructor Create;
destructor Destroy; override;
end;

procedure TUniSocket.Execute;
begin
while (not Terminated) do begin
sleep(400);
end;
end;

constructor TUThread.Create;
begin
inherited Create(true);
Priority := TThreadPriority (tpNormal); // Set Priority Level
FreeOnTerminate := true; // Thread Free Itself when terminated
FTest := TTesting.Create;
end;

destructor TUThread.Destroy;
begin
FTest.Free;
inherited Destroy;
end;


завершение работы потока:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if not FUThread.Suspended then begin
FUThread.Terminate ();
FUThread.WaitFor ();
end;
end;

Где нужно создать цикл выборки сообщений в TTesting.WndProc?



 
Polevi ©   (2003-07-14 10:37) [7]

procedure TUniSocket.Execute;
var
Msg:TMsg;
begin
while GetMessage(msg,0,0,0) do DispatchMessage(msg);
end;


 
Digitman ©   (2003-07-14 11:20) [8]


> SVN17


constructor TUThread.Create;
var
Msg:TMsg;
begin
inherited Create(true);
Priority := tpNormal; // Set Priority Level
FreeOnTerminate := true;
// FTest := TTesting.Create; // здесь - неверно !
Resume;
end;

destructor TUThread.Destroy;
begin
// FTest.Free; // разрушение - в теле Execute !
if GetCurrentThreadId <> ThreadId then
PostThreadMessage(ThreadId, WM_QUIT, 0, 0);
inherited Destroy;
end;


procedure TUniSocket.Execute;
var
Msg:TMsg;
begin
try
FTest := TTesting.Create; // здесь - верно !
try
while not Terminated and GetMessage(msg,0,0,0) do
DispatchMessage(msg);
finally
FTest.Free;
end;
except
//
end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if not FUThread.Suspended then begin
FUThread.Terminate;
PostThreadMessage(FUThread.ThreadId, WM_QUIT, 0, 0);
FUThread.WaitFor;
end;
end;


 
SVN17   (2003-07-14 11:28) [9]

если перепиать код так:
constructor TTesting.Create;
begin
inherited Create;
FHandle := GetHandle;
if FHandle <> 0 then DeallocateHWnd(FHandle);
FHandle := 0;
end;

destructor TTesting.Destroy;
begin
inherited Destroy;
end;


то ошибка появляется при сворачивании окна. Т.e. винда отсылает сообщение на FHandle. Как правильно можно создать, а потом удалить Handle?


 
Digitman ©   (2003-07-14 11:39) [10]


> ошибка появляется при сворачивании окна


как можно вообще свернуть окно, которое создано (см. AllocateHwnd) как невидимое ?


 
SVN17   (2003-07-14 12:05) [11]

Сворачивание окна Form1


 
Digitman ©   (2003-07-14 12:13) [12]

хм ... а причем здесь тогда окно, которое создается по AllocateHwnd() ? В приведенном тобой коде нет ни намека на отправку кем бы то ни было куда бы то ни было каких бы то ни было сообщений


 
Digitman ©   (2003-07-14 12:19) [13]


> SVN17


ты в состоянии объяснить кратко и внятно свою конечную задачу ?
зачем тебе код.поток ? зачем доп.окно, что создаешь в нем ?


 
SVN17   (2003-07-14 12:27) [14]

вот и мне интересно причем? Может быть сообщение отсылаемое виндой широковещательное.


 
SVN17   (2003-07-14 12:40) [15]

> Digitman
Задача: построить обмен по UDP в потоке.
доп.окно, необходимо чтобы получать сообщения о приеме данных
при помощи функции WinSock.recfrom()


 
Digitman ©   (2003-07-14 12:56) [16]


> доп.окно, необходимо чтобы получать сообщения о приеме данных
> при помощи функции WinSock.recfrom()


1. ф-ция WinSock.recfrom() не посылает никаких сообщений ни в какие окна.

2. окно для организации winsock-нотификаций вовсе необязательно - можно обойтись и без окна (см. WSACreateEvent, WSAEventSelect, WSAEnumNetworkEvents, WSAResetEvent и т.п.)

3. Строчка, выделенная ниже жирным

try
Dispatch(Message);
except
Application.HandleException(Self);
end;

получив управление в доп.код.потоке, вызовет исключение, потому что Application - непотокобезопасный объект.



Страницы: 1 вся ветка

Текущий архив: 2003.07.24;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.032 c
1-77847
Тимур
2003-07-12 15:13
2003.07.24
Сервер Excel в delphi


1-77863
Kiril
2003-07-13 15:05
2003.07.24
[Error] Unsatisfied forward or external declaration... ?


1-77821
stkatch
2003-07-09 16:36
2003.07.24
Как узнать Handle текущего потока (Thread)


1-77910
Khloo
2003-07-10 12:19
2003.07.24
Как создать отчёт из таблицы для печати...


1-77875
Дома
2003-07-13 23:08
2003.07.24
2 вопроса (RichEdit и TabControl)