Форум: "WinAPI";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
Внизпотоки на delphi Найти похожие ветки
← →
Rostislav-K (2002-07-23 08:12) [0]Привет всем!
Хочу создать thread, занимающийся исключительно отображением информации для пользователя (на нескольких, в нем создаваемых формах). Его задача - никогда не виснуть, всегда реагировать на клаву и мышь, по таймеру производить простенькие расчеты.
Все работает, пока главный thread не занят.
Я так понимаю сообщения к моему thread-у ходят через главный?
Как можно сделать чтобы мой thread, был полностью независимым?
function WndFunc(HWnd: HWnd; Msg: UINT; wParam: WParam; lParam: LParam): LResult; stdcall;
begin
case Msg of
WM_TIMER: begin
// ...
result := 0;
end;
WM_UPDATE_INTERACT_WINDOW: begin
// ...
end;
WM_CREATE_INTERACT_WINDOW: begin
p := AFormClass.CreateNew(nil);
p.Canvas.Lock;
try
if not InitInheritedComponent(p, TForm) then raise Exception.Create("Can""t create form");
finally
result.Canvas.Unlock;
end;
FForms.Add(p);
result := integer(p);
end;
WM_DELETE_INTERACT_WINDOW: begin
p := pointer(lParam);
FForms.Remove(p);
p.Free;
result := 0;
end;
WM_THREAD_TERMINATE: begin
for i:=0 to FForms.Count-1 do TForm(FForms[i]).Free;
FTerminated := true;
end;
else
Result := DefWindowProc(FWnd, Msg, wParam, lParam);
end;
end;
var c: TWndClass = (
style : 0;
lpfnWndProc : @Wndfunc;
cbClsExtra : 0;
cbWndExtra : 0;
hInstance : 0;
hIcon : 0;
hCursor : 0;
hbrBackground : 0;
lpszMenuName : nil;
lpszClassName : "TThreadMessageWindow"
);
function ThreadFunc(Parameter: Pointer): Integer; //stdcall;
begin
// создаю окно сообщений для потока
c.hInstance := Hinstance;
RegisterClass(с);
FWnd := CreateWindowEx(WS_EX_TOOLWINDOW, c.lpszClassName, "", WS_POPUP, 0, 0, 0, 0, 0, 0, HInstance, nil);
// CreateWindowEx часто, не могу понять когда, возвращает "не найден класс окна"
while not Terminated do begin
GetMessage(lpMsg, 0, 0, 0);
DispatchMessage(lpMsg);
end;
end;
initialization
FHandle := CreateThread(nil, 0, @ThreadFunc, nil, 0, FThreadID);
End.
← →
Digitman (2002-07-23 08:46) [1]1.Как это так - "все работает", если даже окно не может быть создано из-за указанного тобой отказа ?
2. Обращения из доп.потока к VCL-объектам (а форма таковым является) должны быть синхронизированы с очередью сообщений гл.окну приложения, получающим сообщения в осн.потоке. Ты же пытаешься сделать это в дополнительном, что рано или поздно приведет к краху процесса приложения.
3. Сообщения к твоему thread"у через осн.поток не "ходят" - очередь сообщений окнам, созданным в одном потоке никак не зависит от очередей сообщений окнам других потоков
4. Кодовый поток не может быть абсолютно независим : рано или поздно возникнет проблема обращения из потока к неразделяемым ресурсам процесса/системы, а таковые обращения д.б. синхронизированы с обращениями к таким ресурсам всех прочих потоков процесса.
5. Непонятно, почему не применяешь станд.класс TThread - в нем есть готовые и достаточно удобные средства синхронизации
← →
Rostislav-K (2002-07-23 08:59) [2]Привет, Digitman. Я может, неточно выразился. Окно создается через раз. Но вот когда создается все работает.
Вывод в основном потоке меня не устраивает - он как правило занят другими делами. Обращения к vcl, а конкретно к форме, из дугого потока у меня проблем не вызывал, если ее создать с помощью кода из примера (WM_CREATE_INTERACT_WINDOW). Задача такого типа у меня крутится уже пол года. Вопрос-то, в общем такой: если в основном потоке выполняется длинная задача - вывод на экран у меня блокируется до ее завершения.
← →
MBo (2002-07-23 09:06) [3]Насколько я понимаю, общие принципы, которых не мешает придерживаться:
Всем общением с пользователем, окнами и соответственно видимыми элементами должен заниматься основной поток. А вот длинную задачу (счетную?) как раз и стоит вынести в дополнительный поток, причем общение между ними должно быть только с помощью синхронизации, с передачей минимального объема данных.
← →
Rostislav-K (2002-07-23 09:13) [4]все так. только одно маленькое "но".
все, что перечислено у меня "зашито" в компоненту, используемую другими людьми. Я не могу им диктовать чем заниматься (или не заниматься) в главном thread-е.
← →
Digitman (2002-07-23 09:19) [5]Абсолютно согласен с <MBo>
>Rostislav-K
Не те делом ты занялся, уверяю тебя)
А что касается "через раз" - посмотри, как создается окно в "потрохах" того же класса TThread (classes.pas). Класс окна там всякий раз перерегистрируется заново : цепочка UnregisterClass + RegisterClass
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c