Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Разморозить диалоговое окно


Денис178 ©   (2007-07-08 00:27:00) 

В диалоговом окне запускается цикл который вешает окно. Application.ProcessMessages соответственно я лишён, т.к. всё на API надо. Есть ли какие нибудь функции трансляции сообщений или же нужно в отдельный поток выносить?


Денис178   (2007-07-09 11:41:00) [1]

а вот это обязательно?

setthreadpriority(result,IDLE_PRIORITY_CLASS);

разве по умолчанию не IDLE_PRIORITY_CLASS?


VirEx   (2007-07-08 21:19:00) [2]


>  [13] Денис178   (08.07.07 16:05)
>
> > VirEx
>
> Я говорил про TThread

а я в [4] говорил про:

procedure Proc:
begin
end;

result:=BeginThread(nil, 0, @Proc, Parameter, CREATE_SUSPENDED, ID);
setthreadpriority(result,IDLE_PRIORITY_CLASS);
resumeThread(result);


Денис178   (2007-07-08 16:05:00) [3]


> VirEx

Я говорил про TThread


VirEx   (2007-07-08 13:57:00) [4]


>  [8] Денис178   (08.07.07 12:56)
>
> > тогда что собственно мешает запустить цикл в отдельном
> потоке?
>
> не хочется тащить в приложение новые классы.

какие классы? ветка про WinAPI.


Денис178   (2007-07-08 13:39:00) [5]

BeginThread решил всё!
не извелись добрые люди на земле:)
спасибо всем!


Денис178   (2007-07-08 13:17:00) [6]


function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
 Handled: Boolean;
begin
 Result := False;
 if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
 begin
   Result := True;
   if Msg.Message <> WM_QUIT then
   begin
     Handled := False;
     if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
     if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
       not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
     begin
       TranslateMessage(Msg);
       DispatchMessage(Msg);
     end;
   end
   else
     FTerminate := True;
 end;
end;


> Kolan ©, Германн


собсно не так тут и сложно как я думал:) у меня щас примерно и получился Application.ProcessMessages только без TApplication


Однокамушкин   (2007-07-08 13:09:00) [7]


> а как сделать без стандартных классов, на чистом API, не
> знаю.. если есть варианты подскажи пож

F1 + BeginThread


Денис178   (2007-07-08 12:56:00) [8]


> тогда что собственно мешает запустить цикл в отдельном потоке?

не хочется тащить в приложение новые классы. сильно критичен размер моей тузлы. я даже из SysUtils вытащил в отдельный модуль только то что мне необходимо и кстати сэкономил больше 20кб а это всего лишь какой sysutils.

а как сделать без стандартных классов, на чистом API, не знаю.. если есть варианты подскажи пож


Денис178   (2007-07-08 12:51:00) [9]


> А в VCL посмотреть религия запрещает? Или просто лень?

тот кто может без проблем разобраться в рутинах TApplication, тот по моему не будет писать такие топики...


> Однокамушкин  

Вот этот кусочек решил часть проблемы.

     if PeekMessage(Msg,hWin,0,0,pm_NoRemove) then
     begin
       GetMessage(Msg,hWin,0,0);
       DispatchMessage(Msg);
       TranslateMessage(Msg);
     end;

Теперь окно перерисовывается, кнопки нажимаются, но теперь проблема с закрытием окна. Пока работает мой цикл, то ни EndDialog(hWin, 0); ни PostQuitMessage(0); не закрывают окно.. на PostQuitMessage вообще не реагирует, а EndDialog творит непонятное. после вызова окно теряет фокус, вернуть в фокус не получается, кнопки не работают, но окно продолжает перерисовываться и показывать что делает мой цикл.. как нибудь енто можно поправить, кроме того как вручную проверять между GetMessage и DispatchMessage не пришло ли сообщение о закрытии и break'ом тушить цикл?


> Дыкъ. Сказал же ведь - просто выноси цикл за пределы оконной
> процедуры! Функцию какуюнить (можно даже под-функцию) пропиши
> - и проблема уйдёт...

Именно так и сделано, но это проблему не решает.. Пока не завершится дочерний процесс оконной процедуры, то и саму оконную процедуру завершить тоже не получится..


VirEx   (2007-07-08 11:44:00) [10]

хм. значит с чем-то другим попутал.


Kolan   (2007-07-08 11:28:00) [11]

> в Application.ProcessMessages на сколько я понял реализован
> метод, при котором текущий поток приостанавливается до тех
> пор, пока главный поток (с другими дочерними?) приложения
> выполнит свой «такт»

Что-то ты плохо понял :( Посмотри код этого метода…


VirEx   (2007-07-08 11:25:00) [12]

в Application.ProcessMessages на сколько я понял реализован метод, при котором текущий поток приостанавливается до тех пор, пока главный поток (с другими дочерними?) приложения выполнит свой "такт"

я так понимаю что окно своего приложния?
тогда что собственно мешает запустить цикл в отдельном потоке?


Dib@zol   (2007-07-08 11:11:00) [13]


> В диалоговом окне запускается цикл который вешает окно.

Дыкъ. Сказал же ведь - просто выноси цикл за пределы оконной процедуры! Функцию какуюнить (можно даже под-функцию) пропиши - и проблема уйдёт...


Однокамушкин   (2007-07-08 07:50:00) [14]

Ну, отпавлять по такому случаю смотреть исходники Application.ProcessMessages - это жестоко, там много чего дополнительно наворочено, и неопытному человеку отделить нужное от ненужного будет тяжело...

Для организации простейшей петли сообщений достаточно двух функций: PeekMessage (GetMessage вам не подойдёт, т.к. приостановит цикл, если сообщений не будет) и DispatchMessage, если надо, чтобы нормально обрабатывались клавиатурные сообщения, нужно использовать ещё TranslateMessage, внутри диалогового окна также потребуется IsDialogMessage...


Германн   (2007-07-08 04:28:00) [15]


> Денис178   (08.07.07 00:27)
>
> В диалоговом окне запускается цикл который вешает окно.
> Application.ProcessMessages соответственно я лишён, т.к.
>  всё на API надо. Есть ли какие нибудь функции трансляции
> сообщений

А в VCL посмотреть религия запрещает? Или просто лень?


Наверх

Титульная страница Поиск, карта сайта Написать письмо