Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.007 c
9-77704
Antichacker
2003-01-31 10:21
2003.07.24
Существует ли какая-либо документация по GLScene?(Eng)


3-77775
rh
2003-07-02 05:13
2003.07.24
AdoQuery и BatchMove


14-78075
Кен
2003-07-07 07:24
2003.07.24
А есть ли в Дельфи стэк ? По аналогии с тем, что использует проце


14-78120
Ihor999
2003-07-08 16:05
2003.07.24
HTML парсер.


1-77972
AndreyAs
2003-07-11 11:36
2003.07.24
Как обойти circular unit reference ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский