-
> функция обработки сообщений созданного окна выполняется > в основном потоке
Ничего подобного. Оконная функция выполняется в потоке, создавшем окно.
-
Почему вообще WinAPI ? Это блажь или учебная задача ? Если блажь, то чья - твоя или препода ? Если учебная задача, то не рановато ли при таких знаниях "валить препода" ?)
-
Я проверял в режиме отладки эта функция почему-то выполняется основном потоке есть, еще одно подтверждение
var list:Array of integer;
Data:tagCOPYDATASTRUCT;
begin
Data.dwData:= 123;
Data.cbData:= Length(List)*4;
Data.lpData:=@list;
SendMessage(FormThread2,WM_COPYDATA,wParam(@list),lParam(@data));
wParam передает не указатель отправляемому окну равный тому который я передавал и он рабочий, a lParam предает модифицированный указатель предназначенный второму потоку, но при обращении к нему я не могу ничего получить. А WinAPI это задание на курсач типа как для ознакомления с ним, и что они вообще есть. А знания препода оставляют желать лучшего как вам задание передача данных меджу потоками через сообщения. И синхронизация с помощью семафора?
-
type
TMyThread = class(TThread)
private
FhWnd: THandle;
procedure ThreadWndProc(var Message: TMessage);
procedure MsgWmCopydata(var Msg: TWMCopyData); message WM_COPYDATA;
procedure MsgWmSendata(var Msg: TWMSendData); message WM_SEND_DATA;
..
protected
procedure Execute; override;
..
end;
..
procedure TMyThread.MsgWmCopydata(var Msg: TWMCopyData);
begin
.. обработка сообщения WM_COPYDATA ..
end;
procedure TMyThread.MsgWmSendata(var Msg: TWMSendData);
begin
.. обработка сообщения WM_SEND_DATA ..
end;
procedure TMyThread.ThreadWndProc(var Message: TMessage);
begin
Dispatch(Message);
end;
procedure TMyThread.Execute;
var
Msg: TMsg;
begin
FhWnd := AllocateHWnd(ThreadWndProc);
try
while not Terminated and GetMessage(Msg, 0, 0, 0) do
DispatchMessage(Msg);
finally
DeallocateHWnd(FhWnd);
end;
end;
-
Я бы с удовольствием сделал через класс потока, но нельзя. Спасибо. Теперь буду докуривать Джеффри Рихтера, и Windows SDK. Еще раз спасибо.
-
> wParam передает не указатель отправляемому окну равный тому > который я передавал
wParam на момент вызова SensMessage должно содержать хэндл окна-"оптавителя", а ты в этом параметре передаешь черт те что, но только не хэндл окна.
> lParam предает модифицированный указатель
Никакой он не "модифицированный". Обычный указатель на COPYDATASTRUCT-структуру в адресном пространстве процесса-отправителя. А в адресном пространстве процесса-получателя полученный lParam будет содержать совершенно другой указатель на принятую структуру, и это абсолютно нормально - адресные пространства процессов абсолютно изолированы друг от друга.
-
> с удовольствием сделал через класс потока, но нельзя
Да на здоровье. Нельзя так нельзя. Пользуй BeginThread().
-
Вот тебе тоже самое, но без TThread: type
TMyThread = class(TObject)
private
FhWnd: THandle;
procedure ThreadWndProc(var Message: TMessage);
procedure MsgWmCopydata(var Msg: TWMCopyData); message WM_COPYDATA;
procedure MsgWmSendata(var Msg: TWMSendData); message WM_SEND_DATA;
..
end;
..
procedure TMyThread.MsgWmCopydata(var Msg: TWMCopyData);
begin
.. обработка сообщения WM_COPYDATA ..
end;
procedure TMyThread.MsgWmSendata(var Msg: TWMSendData);
begin
.. обработка сообщения WM_SEND_DATA ..
end;
procedure TMyThread.ThreadWndProc(var Message: TMessage);
begin
Dispatch(Message);
end;
function MyThreadFunc(MyThreadObject: TMyThread): Integer;
var
Msg: TMsg;
begin
with MyThreadObject do
begin
FhWnd := AllocateHWnd(ThreadWndProc);
try
while GetMessage(Msg, 0, 0, 0) do
DispatchMessage(Msg);
finally
DeallocateHWnd(FhWnd);
end;
end;
end;
..
BeginThread(nil, 0, @MyThreadFunc, Pointer(TMyThreadObject.Create), MyThreadId);
-
а зачем AllocateHWND???
-
а, ну да... тут же WM_COPYDATA
-
Спасибо за помощь я вроде разобрался маленько. Решил написать как сделал может кому-нибудь когда-нибудь пригодится. Кусок кода чужой, но кое-что я изменил.
function WindowThreadProc(WND:HWND; Msg : Integer; wParam:Wparam;
lParam:Lparam):Longint; stdcall; export;
begin
if Msg=WM_COPYDATA then
begin
end
end;
Function Query:DWORD;
var i:integer;
Msg:TagMSG;
WndClassEx: TWndClassEx;
PQRec:PQueryRecord;
begin
FormThread2 := CreateWindowEx (
ws_Ex_OverlappedWindow,
'Message', 'Plain API Demo',
ws_OverlappedWindow,
cw_UseDefault, 0,
cw_UseDefault, 0,
0,
0,
Thread2,
nil);
if FormThread2 = 0 then
MessageBox (0, 'Window not created',
'Plain API', MB_OK);
SetWindowLong(FormThread2,GWL_WNDPROC,integer(@WindowThreadProc));
while GetMessage(Msg,FormThread2,0,0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
-
> TranslateMessage(Msg);
Эт лишнее.
-
Black_Tomcat (18.01.08 9:51) [30]не забываем про DefWindowProc! function WindowThreadProc(WND:HWND; Msg : Integer; wParam:Wparam;
lParam:Lparam):Longint; stdcall; export;
begin
if Msg=WM_COPYDATA then
begin
end
else
result:=DefWindowProc(WND,Msg,wParam,lParam);
end;
-
Еще раз спасибо. Запомню.
|