Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
Денис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 вся ветка

Форум: "WinAPI";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.038 c
2-1201775767
@!!ex
2008-01-31 13:36
2008.02.24
Получить иконку окна.


15-1201184222
AntonUSAnoV
2008-01-24 17:17
2008.02.24
как оценить свой труд ?


2-1201633028
Inslave
2008-01-29 21:57
2008.02.24
Перемещаться как по Radiobutton ам


15-1200274708
KilkennyCat
2008-01-14 04:38
2008.02.24
Книги, Электронные. Когда их очень много...


15-1200776703
Riply
2008-01-20 00:05
2008.02.24
Рекурсивная работа с FindFirst/Next





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