Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
Внизсоздание в delphi mdichild окон в отдельном потоке Найти похожие ветки
← →
Mim (2004-03-06 23:51) [0]Ни кто не реализовывал в
delphi возможность создания в delphi
mdichild окон в отдельном (не основоном
потоке)?
Я как понимаю проблемма здесь в том что
мы не можем обращаться из разных потоков
к одному vcl"ному или clx"ному обьекту
коеми являются application, screen и
mainform с которыми работает mdichild
окошко.
Как бы это обойти?
← →
Digitman © (2004-03-07 11:37) [1]
> возможность создания в delphi
> mdichild окон в отдельном (не основоном
> потоке)?
зачем ?
только не говори что будет якобы быстрей все работать или "тормозить" что-то там перестанет
доп.поток нужен для выполнения длительных вычислений параллельно с вычислениями в осн.потоке, которые как правило сводятся с вычислениями, связанными с обработкой сообщений/событий польз.интерфейса
← →
Mim (2004-03-07 21:12) [2]Digitman © (07.03.04 11:37) [1]
Дело в том что моя программа построена таким образом что mdichild окна загружаются из динамически подключаемых библиотек которые пишут другие програмисты, и хочется добится максимально стабильной работы программы, даже если в библиотеке есть ошибка.
К стати мелкософт же сделала так что каждое окно роводника запускается в отдельном потоке, мне кажется что это наиболее врное решение.
← →
Zacho © (2004-03-07 21:33) [3]
> К стати мелкософт же сделала так что каждое окно роводника
Не в потоке, а в процессе. Хотя могу и ошибаться, специально не проверял.
← →
Mim (2004-03-08 08:49) [4]Zacho © (07.03.04 21:33) [3]
Действительно ошибаетесь по умолчанию для каждого окна создается отдельный поток, о чем говорит не несколько а одна explorer.exe в списке задач, хотя в XP есть галочка "запускать проводники в отдельном пероцессе".
Давайте всеже вернемся к основоному вопросу.
← →
TUser © (2004-03-08 09:04) [5]
> мы не можем обращаться из разных потоков
> к одному vcl"ному или clx"ному обьекту
Надо использовать synchronize, хотя честно говоря, я не очень понял в чем состоит твоя проблема.
← →
Cobalt © (2004-03-08 10:13) [6]>TUser © (08.03.04 09:04) [5]
>Надо использовать synchronize
Тогда лучше в основном потоке не использовать самому всякие способы синхронизации(мьютексы, там или эвентсы). А то основной поток будет ждать, а ему попробуют сделать synchronize тот, кто захватил мьютекс. И будет мертвая блокировка.
← →
Плохиш (2004-03-08 10:47) [7]>Mim (08.03.04 08:49) [4]
Вообще-то Микрософт использует SDI
← →
Mim (2004-03-08 10:58) [8]TUser © (08.03.04 09:04) [5]
Cobalt © (08.03.04 10:13) [6]
Во втором абзаце небыло знака вопроса, зачем же вы отвечаете то что я и так знаю :)
Плохиш (08.03.04 10:47) [7]
Просто mdiparent"ом это формы является desktop. Готов с вами поспорить на эту тему в отдельной ветке (если вы несогласны).
Давайте всеже вернемся к основоному вопросу.
← →
Mim (2004-03-08 11:06) [9]Вообщем уточняю вопрос
Как сделать чтобы в каждом потоке была своя очередь сообщенийwhile getmessage(...) do
begin
processmessage(...);
dispatchmessage(...);
end;
работающая только с этим окном
Как я понимаю такое невозможно, или нет?
← →
Erik © (2004-03-08 13:37) [10]Почему невозможно? Все будет работать даже есть спецальная функция которая ждет события или сообщения. MsgWaitForMultipleObject и пр...
Это просто цикл обработки сообщений в потоке.
while PeekMessage(Msg, 0, 0, 0, pm_Remove) do
begin
if Msg.Message = wm_Quit then
Halt(Msg.WParam);
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
← →
Mim (2004-03-08 20:00) [11]Erik © (08.03.04 13:37) [10]
Почему невозможно? Все будет работать даже есть спецальная функция которая ждет события или сообщения. MsgWaitForMultipleObject и пр...
MsgWaitForMultipleObject работает не с сообщениями. Это один из инструментов межпоточной синхранизации, как я уже говорил, второй абзац, без знака вопроса.
Что касается вашего кода то вы повторили мой небольшим измением :)
Думается что ваш код будет грузить процессор под 100%
чтоже касается завести в каждом потоке цикл обработи сообщений то таких проблемм нет, нужно завести в кадом потоке свой обьект application который будет вращать этот цикл внутри apllication.run. Как я понимаю это не реализуемо поскольку тогда перестанет функционировать mdi основа приложения.
Предлагаю тему на этом закрыть :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.034 c