Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-35759
[lamer]Barmaglot
2002-08-30 17:46
2002.09.12
Помогите разобраться с динамическим созданием процедур...


1-35754
Дядя Будда
2002-08-30 15:35
2002.09.12
Experts для Delphi


3-35592
NIKI
2002-08-19 16:20
2002.09.12
SQL


14-35897
asafr
2002-08-19 14:27
2002.09.12
Первый день после отпуска. FastReport и frChart ...


1-35686
delpher_gray
2002-09-02 14:35
2002.09.12
Компоненты





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский