Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.24;
Скачать: CL | DM;

Вниз

Разморозить диалоговое окно   Найти похожие ветки 

 
Денис178   (2007-07-08 00:27) [0]

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


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


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

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


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

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

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


 
Dib@zol ©   (2007-07-08 11:11) [3]


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

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


 
VirEx ©   (2007-07-08 11:25) [4]

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

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


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

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

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


 
VirEx ©   (2007-07-08 11:44) [6]

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


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


> А в 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"ом тушить цикл?


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

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


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


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

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

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


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


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

F1 + BeginThread


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


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


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

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


 
VirEx ©   (2007-07-08 13:57) [12]


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

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


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


> VirEx

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


 
VirEx ©   (2007-07-08 21:19) [14]


>  [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-09 11:41) [15]

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

setthreadpriority(result,IDLE_PRIORITY_CLASS);

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



Страницы: 1 вся ветка

Текущий архив: 2008.02.24;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.021 c
2-1201959461
Scapman
2008-02-02 16:37
2008.02.24
Сделать форму активной


15-1200763466
мойипизвестен
2008-01-19 20:24
2008.02.24
А что будет если...


3-1191840455
rtm
2007-10-08 14:47
2008.02.24
Экспoрт и импорт БД в текстовый файл (ASCII).


2-1201687303
Я
2008-01-30 13:01
2008.02.24
Как получить интервалы дат в неделях года


15-1201140506
O.O
2008-01-24 05:08
2008.02.24
Перевод числа в строку на разных языках