Форум: "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 на сколько я понял реализован
> метод, при котором текущий поток приостанавливается до тех
> пор, пока главный поток (с другими дочерними?) приложения
> выполнит свой «такт»
Что-то ты плохо понял :( Посмотри код этого метода…
← →
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.162 c