На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Форма в отдельном потоке
    Мне нужно создать форму в отдельном потоке и делать ProcessMessage в цикле.
    Сталкиваюсь с кучей проблем: если создавать форму через TThread.Synchronize, то в главном потоке нужно сделать Application.ProcessMessages, чтобы этот Synchronize сработал. Если делать без Synchronize, то идёт завис на TForm.Show. Но это ещё ладно, это решаемо.
    Основная проблема в том, что я не могу делать Application.ProcessMessages из нового потока – он тупо не работает. Хотя по логике, раз я создал окно в этом потоке, значит оно ему и принадлежит, следовательно ProcessMessages должно работать. Но не работает. И даже если я сам делаю PeekMessage/TranslateMessage/DispatchMessage, всё равно не пашет.
    Как решить эту проблему?
    Такое ощущение, что для всех создаваемых форм хозяином принудительно делается главный поток <_<

    Добавлено
    Может, я туплю, конечно, где-то... покажите где.
      >Мне нужно создать форму в отдельном потоке и делать ProcessMessage в цикле.
      Это техзадание такое?


      http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1411
        Цитата MBo @
        Это техзадание такое?
        Ну почему ж ТЗ ?
        Я прошу подсказки как это реализовать... и почему не пашет
        Исходники интересные, спасибо ;)

        Но мне хочется понять, как это реализовать средствами . И действительно ли:
        Цитата Jin X @
        для всех создаваемых форм хозяином принудительно делается главный поток
        ???
          Цитата Jin X @
          Такое ощущение, что для всех создаваемых форм хозяином принудительно делается главный поток

          В винде "хозяином" любого окна является поток, в котором это окно создано. Поэтому если форма создается через Synchronize в главном потоке и при этом явно или неявно происходит обращением к св-ву Handle формы, то ее "хозяином" будет главный поток.

          PS: Окно формы создается не сразу в Create, а при первом обращении к св-ву Handle. Чтобы окно 100% создавалось в конструкторе формы, нужно добавить в событие OnCreate обращение к св-ву Handle или вызвать метод HandleNeeded
            Если Synchronize всё равно вызывает метод из главного потока, как же мне создать VCL-форму из другого потока, чтобы окно принадлежало ему? Никак?

            Добавлено
            Суть в том, что есть основной поток, который загружен своей работой (без окон), и напрягать его всякими Application.ProcessMessages не хочется (я бы даже сказал, это делать неудобно).
            Я хочу, чтобы окно обновлялось (перерисовывалось, реагировало на кнопки и пр.) в параллельном потоке (суть похожа на SplashScreen, только хочется сделать это VLC-методами).
              обычно в основном потоке ГУЙ, а в дополнительных какая-то тяжёлая работа
              и никаких проблем...
              почему ты хочешь сделать наоборот?
                Цитата Jin X @
                VCL-форму из другого потока, чтобы окно принадлежало ему? Никак?

                никак. VCL вообще однопоточна.
                  Цитата Jin X @
                  Мне нужно создать форму в отдельном потоке

                  Почему не воспользоваться CreateWindowEx, WinAPI? Вполне может сработать! Впрочем, нюансов про потоки что то не припомню, нужно проверять!
                  Сообщение отредактировано: Руслан -
                    Цитата Shaggy @
                    обычно в основном потоке ГУЙ, а в дополнительных какая-то тяжёлая работа
                    и никаких проблем...
                    почему ты хочешь сделать наоборот?
                    Цитата Руслан @
                    Почему не воспользоваться CreateWindowEx, WinAPI?
                    Так и думал, что будут такие советы...
                    Ладно, я понял, что VCL в потоке – не лучший вариант...:wall:
                      Цитата Jin X @
                      Так и думал, что будут такие советы...

                      Могу короткий пример выдрать и своего проекта, легок для интеграции. :-?
                      Впрочем, довольно геморно компоненты располагать на форме - вручную(в моем древнем проекте всё есть)...
                        Если у тебя через WinAPI, то примера MBo достаточно.
                          Собственно, в чем проблема-то? Создаешь поток, в нем создаешь форму, а затем начинаешь крутить цикл выборки сообщений. Все то же самое, что и для сплэш-формы. Разумеется, никакие Synchr и App.ProcMessages не используются, т.к. они рассчитаны только на штатную архитектуру "Гуй в главном потоке - все остальное в дочерних".
                            Да, только когда ты будешь делать GetMessage, сообщения тебе будут приходить для этого потока, а форма создаётся в главном потоке (даже при создании её из второго треда, поскольку нужно создавать её через Synchronize). Вот в этом и проблема.
                              Цитата Jin X @
                              поскольку нужно создавать её через Synchronize

                              Кто тебе это сказал?
                                VCL нельзя использовать в отдельно созданных тредах, могут возникать ошибки. И возникают. Например, вызываешь метод Show, и прога виснет. По крайней мере, если в основном треде идёт какой-то долгий процесс без чтения сообщений (Application.ProcessMessages и иже с ним).
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0356 ]   [ 16 queries used ]   [ Generated: 7.05.24, 00:57 GMT ]