Форум: "Основная";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];
ВнизОбработчик сообщений Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.012 c